Javaを学び始めたばかりです。ダミーの質問があります。この状況で理由がよくわかりません:
int j = 5;
for (int j = 0; j < 10; j++) {
// do sth
}
私のコンパイラは言う: the variable j is already defined in the scope
.
なぜこの秒j
が問題なのですか?最初のものを単純にシャドウする必要があると思いました。
Javaを学び始めたばかりです。ダミーの質問があります。この状況で理由がよくわかりません:
int j = 5;
for (int j = 0; j < 10; j++) {
// do sth
}
私のコンパイラは言う: the variable j is already defined in the scope
.
なぜこの秒j
が問題なのですか?最初のものを単純にシャドウする必要があると思いました。
問題は、変数j
を 2 回宣言していることです。1 つはfor
ループの外で、もう 1 つは内部です。上の行を削除するだけで、準備完了for
です。
ローカル変数はシャドウされません - おそらくフィールドを念頭に置いていました (しかし、それはここにあるものとは異なります)。
より単純で類似したシナリオは次のとおりです。
int i = 0;
{
int i = 2;
}
したがって、2 つのi
変数があります。あなたが参照するとき、あなたはどれを意味しますi
か?
Java コンパイラは、ここでの「シャドウイング」を許可していません。定義があいまいであり、コンパイラはこれを警告しようとしています。
シャドウイングと隠蔽のルールについては、Java 言語仕様のセクション 6.4を参照してください。
彼らは同じ例を提供しています:
メソッド、コンストラクター、または初期化ブロックのローカル変数としての識別子の宣言は、同じ名前のパラメーターまたはローカル変数のスコープ内に現れてはならないため、次のプログラムではコンパイル時エラーが発生します。
class Test1 {
public static void main(String[] args) {
int i;
for (int i = 0; i < 10; i++)
System.out.println(i);
}
}
この制限は、他の方法では非常にわかりにくいバグを検出するのに役立ちます。スーパークラスにメンバーを追加すると、サブクラスがローカル変数の名前を変更しなければならなくなる可能性があるため、ローカル変数によるメンバーのシャドーイングに関する同様の制限は非現実的であると判断されました。関連する考慮事項により、ネストされたクラスのメンバーによるローカル変数のシャドウイング、またはネストされたクラス内で宣言されたローカル変数によるローカル変数のシャドウイングに対する制限も魅力的ではありません。
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
}
シャドウイングは、変数の 1 つがメソッド フィールドで、もう 1 つがローカル変数である場合にのみ発生します。あなたの場合、両方ともローカル変数であるため、互いにシャドウすることはできません。
同じ名前の 2 つのフィールドを持つことができないのと同じ方法でスコープを共有する場合、同じ名前の 2 つのローカル変数を持つことはできません。
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
}
j
variable を 2 回宣言しています。コードを次のように書き換えます。
for (int j = 0; j < 10; j++) {
// do sth
}
また
int j;
for (j = 0; j < 10; j++) {
// do sth
}