4

Javaを学び始めたばかりです。ダミーの質問があります。この状況で理由がよくわかりません:

int j = 5;
for (int j = 0; j < 10; j++) {
   // do sth
}

私のコンパイラは言う: the variable j is already defined in the scope.
なぜこの秒jが問題なのですか?最初のものを単純にシャドウする必要があると思いました。

4

8 に答える 8

6

問題は、変数jを 2 回宣言していることです。1 つはforループの外で、もう 1 つは内部です。上の行を削除するだけで、準備完了forです。

ローカル変数はシャドウされません - おそらくフィールドを念頭に置いていました (しかし、それはここにあるものとは異なります)。

于 2013-08-07T08:34:49.380 に答える
4

より単純で類似したシナリオは次のとおりです。

int i = 0;
{
   int i = 2;
}

したがって、2 つのi変数があります。あなたが参照するとき、あなたはどれを意味しますiか?

Java コンパイラは、ここでの「シャドウイング」を許可していません。定義があいまいであり、コンパイラはこれを警告しようとしています。

于 2013-08-07T08:36:03.417 に答える
3

シャドウイングと隠蔽のルールについては、Java 言語仕様のセクション 6.4を参照してください。

彼らは同じ例を提供しています:

メソッド、コンストラクター、または初期化ブロックのローカル変数としての識別子の宣言は、同じ名前のパラメーターまたはローカル変数のスコープ内に現れてはならないため、次のプログラムではコンパイル時エラーが発生します。

class Test1 {
    public static void main(String[] args) {
        int i;
        for (int i = 0; i < 10; i++)
            System.out.println(i);
    }
}

この制限は、他の方法では非常にわかりにくいバグを検出するのに役立ちます。スーパークラスにメンバーを追加すると、サブクラスがローカル変数の名前を変更しなければならなくなる可能性があるため、ローカル変数によるメンバーのシャドーイングに関する同様の制限は非現実的であると判断されました。関連する考慮事項により、ネストされたクラスのメンバーによるローカル変数のシャドウイング、またはネストされたクラス内で宣言されたローカル変数によるローカル変数のシャドウイングに対する制限も魅力的ではありません。

于 2013-08-07T08:39:19.343 に答える
0
Cause this is a duplicate local variable problem, You already define "j" variable before. Try this:

                int i = 5;
        for (int j = 0; j < 10; j++) {
           // do sth
        }
于 2013-08-07T08:37:06.723 に答える
0

シャドウイングは、変数の 1 つがメソッド フィールドで、もう 1 つがローカル変数である場合にのみ発生します。あなたの場合、両方ともローカル変数であるため、互いにシャドウすることはできません。

同じ名前の 2 つのフィールドを持つことができないのと同じ方法でスコープを共有する場合、同じ名前の 2 つのローカル変数を持つことはできません。

于 2013-08-07T08:37:09.577 に答える
0
 int j = 5; // this j is visible to whole method 
 for (int j = 0; j < 10; j++) { 
      // so still j is visible to this for loop and you can use it 
      // but you can't initialize it again
 // do sth
 }
于 2013-08-07T08:37:19.430 に答える
0

jvariable を 2 回宣言しています。コードを次のように書き換えます。

for (int j = 0; j < 10; j++) {
   // do sth
}

また

int j;
for (j = 0; j < 10; j++) {
   // do sth
}
于 2013-08-07T08:37:42.590 に答える