ホームページ > Java > &#&チュートリアル > コンストラクターで初期化したにもかかわらず、Java フィールドが Null になるのはなぜですか?

コンストラクターで初期化したにもかかわらず、Java フィールドが Null になるのはなぜですか?

Susan Sarandon
リリース: 2024-11-29 18:03:10
オリジナル
913 人が閲覧しました

Why Are My Java Fields Null Despite Initialization in the Constructor?

Java フィールド初期化における混乱: シャドウイングの役割

クラス コンストラクターでフィールドを宣言して初期化するときに、不可解な出来事が発生する可能性があります。 : 初期化の努力にもかかわらず、フィールドは null のままか、デフォルト値を保持します。これは、シャドウイングとして知られる現象によって発生します。

スコープとシャドウ

Java のすべてのエンティティにはスコープがあり、どこで実行できるかが決まります。単純な名前を使用して参照できます。クラス内でフィールドを宣言すると、ネストされた宣言を含むクラス本体全体を含むスコープが設定されます。

ローカル変数とフィールド

コンストラクターでは、フィールドと同じ名前のローカル変数を誤って導入してしまう可能性があります。ローカル変数のスコープは狭く、コンストラクター本体内のみに拡張されます。ローカル変数がフィールドと同じ名前で宣言されている場合、フィールドはシャドウされます。つまり、スコープ内ではローカル変数が優先されます。

シャドウイングの例:

を考慮してください。このコード:

public class Sample {

    private String[] elements;
    private int capacity;

    public Sample() {
        int capacity = 10;
        String[] elements;
        elements = new String[capacity];
    }
}
ログイン後にコピー

ここでは、コンストラクターのシャドウイングが混乱を引き起こしています。ローカル変数の容量と要素がフィールドより優先されるため、フィールド メンバーは null のままになるか、デフォルト値 (int の場合は 0、参照の場合は null) に初期化されます。

考えられる解決策:

シャドウイングを回避するには、ローカル変数に一意の名前を使用するか、修飾名を使用してフィールドを明示的に参照することを検討してください (例: this.elements、この容量)。例:

public Sample() {
    this.capacity = 10;
    this.elements = new String[capacity];
}
ログイン後にコピー

シャドウイングの他のインスタンス

シャドウイングはコンストラクター パラメーターでも発生する可能性があります。コンストラクター パラメーターの名前がフィールドと同じである場合、そのパラメーターがコンストラクター本体内で優先されます。このような場合にフィールドにアクセスするには、次の修飾名を使用します。

回避推奨事項:

シャドウイングによる予期しない動作を防ぐには、通常、distinct を使用することをお勧めします。フィールド、ローカル変数、コンストラクター パラメーターの名前。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート