シャドーイングがフィールドの初期化を妨げる理由
クラスには、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 サイトの他の関連記事を参照してください。