2017-05-22 5 views
-2
static int B,H; 
static boolean flag = true; 
static { 
    Scanner scan = new Scanner (System.in); 
    B = scan.nextInt(); 
    H = scan.nextInt(); 
    scan.close(); 

そしてJavaのstatic初期化子ブロックのデータ型

static int B,H; 
static boolean flag = true; 
static { 
    Scanner scan = new Scanner (System.in); 
    int B = scan.nextInt(); 
    int H = scan.nextInt(); 
    scan.close(); 

なぜBとHのためにこれらの二つの機能の異なる出力を持っていますか? BとHの前にintを定義する場合と定義しない場合の違いは何ですか?

+0

出力ステートメントはどこですか? –

+1

後者の 'static'初期化ブロックでは、2つのローカル変数宣言がフィールドをマスキングしています。 – Logan

+0

OPがコード内の不正行為の説明を求めているので、これは重複としてマークされるべきではないと思います。それは彼らが何らかの言葉に遭遇して説明を求めるのではなく、実際のコードではないことを説明することです。 – gonczor

答えて

4

BHを新しいローカル変数として再定義します。

0

2番目のケースでは、2つのローカル変数を導入しています。静的フィールドをオーバーライドし、静的イニシャライザでのみ使用できます。

4

2番目のコードでは、BとHはブロック内のローカル変数です。フィールドにはまったく割り当てられていません。あなたがこの方法を書いたかのようにそれは...

分の静的初期化を忘れてまったく同じです - あなたはこのコードを持っていたと想像:あなたが実行している場合今

public class Foo { 
    private int value; 

    public void calculateValue() { 
     int value = new Random.nextInt(5); 
    } 

    public int getValue() { 
     return value; 
    } 
} 

を:

Foo foo = new Foo(); 
foo.computeValue(); 
System.out.println(foo.getValue()); 

... computeValue()メソッドは新しいローカル変数を宣言するだけなので、0を出力します。

全く同じものは静的初期化子ブロックで発生します。このブロックでは:

static { 
    Scanner scan = new Scanner (System.in); 
    int B = scan.nextInt(); 
    int H = scan.nextInt(); 
    scan.close(); 
} 

...あなたは新しいローカル変数にBHを宣言している - ので、彼らはすべての静的フィールドBHには影響を与えません。

関連する問題