変数


🎃 変数のスコープについて

同じスコープ内で同名の変数を定義することはできません。
ブロックでスコープを限定すれば、その外では同名の変数を定義できます。

public static void main(String.. args) {
{ // ブロックで囲むとスコープが定義される
int i = 0;
System.out.println(i); //スコープ内ならコンパイルは通る
}
int i = 1; // スコープ外で同名の変数を定義するのはOK
}

逆に、最初に変数を宣言した場合はスコープが重複する(シャドーイング)ためコンパルエラーとなります。

public static void main(String... args) {
int i = 0;
{
int i = 0; // 上のiが有効なため、コンパイルエラー
}
}

フィールド変数の場合は重複してもエラーにはなりません。ローカル変数が優先されます。

class Main {
int i = 0; // フィールド変数
void doSomething() {
int i = 1; // ローカル変数
System.out.println(i); // ローカル変数が優先され、1を表示
System.out.println(this.i); // フィールド変数を使う場合はthisをつける。0が表示
}
}

🐯 参考リンク

📚 おすすめの書籍