1

メイン関数を持つクラス内で初期化されていない変数にデフォルト値が割り当てられないのはなぜですか???

class Test {
    public static void main(String[] args) {

        int x;// x has no default value
        String y;// y has no default value
        System.out.println("x is " + );
        System.out.println("y is " + );
    }
}

メイン関数のないクラスで変数が初期化されていない場合は、デフォルト値が割り当てられます。

class Student {
    String name; // name has default value null
    int age; // age has default value 0
    boolean isScienceMajor; // isScienceMajor has default value false
    char gender; // c has default value '\u0000'
    int x;
    String y;
}
4

4 に答える 4

5

問題のコードはさまざまな状況を表していることに注意してください。最初のケースでは、変数はローカルmain()であり、メソッド内に存在します。2 番目のケースでは、ローカル変数ではなく、インスタンスの属性を宣言しています。

Java では、属性のみがデフォルト値で自動的に初期化されます。メソッド内であっても、すべてのメソッドで、main()メソッド内でローカルに宣言された変数の初期化値を明示的に指定する必要があります。

これは、Java 言語仕様のセクション§4.12.5で説明されています。

各クラス変数、インスタンス変数、または配列コンポーネントは、作成時にデフォルト値で初期化されます (§15.9、§15.10)

各メソッド パラメーター (§8.4.1) は、メソッドの呼び出し元によって提供される対応する引数値に初期化されます (§15.12)。

各コンストラクタ パラメータ (§8.8.1) は、クラス インスタンス作成式 (§15.9) または明示的なコンストラクタ呼び出し (§8.8.7) によって提供される対応する引数値に初期化されます。

例外パラメーター (§14.20) は、例外 (§11.3、§14.18) を表すスローされたオブジェクトに初期化されます。

ローカル変数 (§14.4、§14.14) は、初期化 (§14.4) または割り当て (§15.26) のいずれかによって、使用前に明示的に値を指定する必要があります。 16)

ローカル変数が自動的に初期化されない理由をいくつか確認するには、この前の質問ご覧ください。

于 2013-07-25T13:51:21.517 に答える
2

基本的な理由は、一般的なプログラマ エラーをキャッチするために、Java の作成者がすべての変数が使用される前に割り当てられていることを確認することにしたためです。ただし、フィールドにこれを強制することはできないため、フィールドのデフォルト値を指定する必要がありました。

初期化される前にコンストラクターでフィールドを使用するとエラーが発生しますが、コンパイラーがこれを防ぐ方法はありません。

class C {
  int f;

  C() {
    init();
  }

  void init() {
    System.out.println(f);
  }
}
于 2013-07-25T13:55:06.430 に答える
1

値が与えられる前に変数の値を読み取ることは、バグの一般的な原因です。変数を使用する前に値を割り当てることを強制すると、プログラムがより安全になります。特定のプログラムフローを予期していなかったという理由だけで、デフォルト値ではなく、期待する値が得られることがわかります。

残念ながら、このニーズを実装する活性分析はローカル変数に対してのみ実行でき、プログラムが値で初期化する前にインスタンス フィールドにアクセスできます。予期しない動作を回避するために、JVM はインスタンス フィールドをデフォルト値に初期化します。

于 2013-07-25T13:56:02.527 に答える
1

JVM が新しいオブジェクト インスタンスを作成するとき、属性はクラス自体の一部であるため、属性にメモリを割り当てる必要があります。Java プリミティブ int が存在するだけで、4 バイトのメモリを割り当てる必要がありますが、an はオブジェクトであるため、Integerに設定できます。nullそのため、初期化時にクラスの属性を何かに設定する必要があります。

于 2013-07-25T13:56:18.913 に答える