ホームページ >Java >&#&チュートリアル >コンストラクターで初期化されているように見えるにもかかわらず、Java インスタンス変数が初期化されていないのはなぜですか?

コンストラクターで初期化されているように見えるにもかかわらず、Java インスタンス変数が初期化されていないのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-04 10:43:10657ブラウズ

Why Are My Java Instance Variables Uninitialized Despite Appearing to Be Initialized in the Constructor?

シャドウイングによるフィールドの初期化に関する混乱

Java では、シャドウイングとは、スコープ内で宣言された変数が変数を隠蔽する現象を指します。同じ名前が外側のスコープで宣言されています。提供されたコード スニペットでは:

class StringArray {
    private String[] elements;
    private int capacity;

    public StringArray() {
        int capacity = 10;  // Local variable shadowing field
        String[] elements;  // Local variable shadowing field
        elements = new String[capacity];
    }

    // Getters omitted for brevity
}

ローカル変数シャドウイング

コンストラクター本体内の最初と 2 番目のステートメントは、capacity と elements という名前のローカル変数を宣言します。これらのローカル変数は、同じ名前のインスタンス変数をシャドウします。したがって、コンストラクター スコープ内の容量および要素への割り当てまたは参照は、ローカル変数にのみ影響します。

シャドウイング ルール

シャドウイング ルールは、ローカル変数がローカル変数よりも高い優先順位を持つことを指示します。スコープ内のインスタンス変数。これは、10 に初期化されたローカル変数の容量がインスタンス変数の容量より優先され、インスタンス変数は初期化されないままになることを意味します。同様に、要素への代入では、インスタンス変数ではなくローカル変数が初期化されます。

フィールドの初期化

インスタンス変数はコンストラクターで明示的に初期化されないため、それぞれのタイプにデフォルト値 (容量には 0、要素には null) が割り当てられます。これが、クラスの getter メソッドがこれらのデフォルト値を返す理由です。

解決策

この問題を解決するには、ローカル変数宣言を削除し、インスタンス変数を参照します。直接:

public StringArray() {
    this.capacity = 10;
    this.elements = new String[this.capacity];
}

回避

このような混乱を避けるために、ローカル変数とインスタンス変数には一意の名前を使用する習慣を採用してください。

以上がコンストラクターで初期化されているように見えるにもかかわらず、Java インスタンス変数が初期化されていないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。