ホームページ >Java >&#&チュートリアル >コンストラクターでフィールド値が正しく初期化されないのはなぜですか?

コンストラクターでフィールド値が正しく初期化されないのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-02 19:11:12637ブラウズ

Why Are My Field Values Not Initialized Correctly in My Constructor?

シャドーイングがフィールドの初期化を妨げる理由

クラスには、capacity および elements という名前のフィールドがあり、コンストラクターで初期化しようとします。ただし、構築中に設定した値は、フィールド値をクエリするときに反映されません。この動作は、シャドウイング と呼ばれる概念に基づいています。

シャドウイングは、2 つの変数が同じ名前を共有しているが、異なるスコープ内に存在する場合に発生します。コンストラクターでは、capacity および elements という名前のローカル変数を宣言します。これらのローカル変数は、コンストラクターのスコープ内の対応するフィールドよりも優先され、実質的にそれらをシャドウイングします。

public StringArray() {
    int capacity = 10; // Local variable shadows field
    String[] elements; // Local variable declaration without initializer
    elements = new String[capacity]; // Initializes local variable, not field
}

結果として、ローカル容量変数への代入により、フィールドではなくその変数が初期化されます。同様に、要素変数を初期化しても、ローカル変数が優先されるため、その割り当てはフィールドには影響しません。したがって、フィールド容量はデフォルト値 (0) のままで、要素は null に設定されます。

この問題を解決するには、コンストラクター内のローカル変数宣言を削除して、名前の容量と要素が参照できるようにします。インスタンス変数。

public StringArray() {
    // Remove local variable declarations
    this.capacity = 10;
    this.elements = new String[capacity];
}

または、コンストラクター パラメーターを保持する必要がある場合は、修飾名を使用してインスタンスを明示的に参照します。変数。

public StringArray(int capacity) {
    this.capacity = capacity; // Initializes the field using qualified name
}

以上がコンストラクターでフィールド値が正しく初期化されないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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