1

{変数のスコープが start of blockと end of blockで囲まれていることは知っています}。ブロック内で同じ変数を宣言すると、コンパイル エラーVariable already definedが発生します。しかし、次の例を見てください。

public class Test{
int x=0;// Class scope variable

public void m(){
  int  x=9;   //redeclaration of x is valid within the scope of same x. 

  if(true){
      int x=7; // but this redeclaration generates a compile time error.
  }

}

ここでxは、クラスで既に宣言されていますが、メソッドで再宣言できます。ただし、ifブロック内でxは再宣言できません。

クラス スコープ変数の再宣言ではエラーが発生しないのに、メソッド スコープ変数の再宣言ではエラーが発生するのはなぜですか?

4

3 に答える 3

2

これは、int x=0が変数ではなくインスタンス フィールドであるためです。ローカル変数は、フィールドと同じ名前を持つことができます。変数と同じ名前のフィールドを区別するために、thisインスタンス フィールドにはプレフィックスを使用し、クラス フィールドにはクラス名を使用します。例えば

int x = this.x
于 2013-10-20T02:43:03.593 に答える
2

それがJavaが設計された方法だからです。言語設計者は、ローカル変数とインスタンス変数に同じ名前を使用できないようにすることは簡単にできたはずです。彼らは単にそうしないことを選びました。

于 2013-10-20T02:47:53.783 に答える