Java Silver 12.5 インスタンス変数やクラス変数と、ローカル変数の優先度に関する問題

インスタンス変数クラス変数は、クラス定義の直下、メソッドの外に定義する変数です。一方、ローカル変数はメソッド内で宣言する変数です。インスタンス変数やクラス変数はクラス内すべてが有効範囲ですが、ローカル変数はその変数を宣言したメソッド内だけが有効範囲となります。

インスタンス変数やクラス変数は、同じクラス内に同名のものを複数定義することはできません。ただし、インスタンス変数やクラス変数と同名のローカル変数は定義できます。
インスタンス変数やクラス変数と同名のローカル変数がある場合、変数名だけを記述するとコンパイラはローカル変数だと解釈します。インスタンス変数であることを明示したい場合には「this.フィールド名」を、クラス変数の場合には「クラス名.フィールド名」の書式で記述します。

設問のコードでは、2行目でクラス変数numが宣言されていますが、4行目でローカル変数numも宣言されています。そのため、設問のコードではint型のローカル変数numを宣言し、numの値を代入するというコードとしてコンパイラに解釈されます。
4行目で宣言したローカル変数numは初期化されていないため、5行目でこの変数を参照するとコンパイルエラーが発生します。以上のことから選択肢Cが正解です。
設問のコードでクラス名を記述してクラス変数を使うことを明示すれば、コンパイルエラーは発生することなく、23が表示されます。

// クラス変数を使うことを明示
public class Sample {
  static int num = 23;
  public static void main(String[] args) {
    int num = Sample.mum;
    System.out.println(num);
  }
}

【6.5, 6.9】

この記事が気に入ったらサポートをしてみませんか?