Java でのクラス変数のオーバーライド: 隠された謎
この疑問は、クラス階層、特にDad という名前の親クラスとその子クラスである Son。どちらのクラスも、そのアイデンティティを表すことを目的とした me という名前のクラス変数を持っています。ただし、Son オブジェクトをインスタンス化し、その printMe() メソッドを呼び出す doIt() メソッドが、予期される「son」ではなく「dad」を出力する場合に問題が発生します。
Can Class Variables Beオーバーライドされていますか?
これに答えるために、Java の継承とオーバーライドの概念を詳しく掘り下げます。オーバーライドとは、スーパークラスで定義されたメソッドの動作をサブクラスが変更できることを指します。ただし、この概念はクラス変数には適用されません。
非表示とオーバーライド
クラス変数の場合、行われるのはオーバーライドではなく「非表示」です。 」サブクラスがスーパークラス内の変数と同じ名前のクラス変数を宣言すると、継承された変数は置換されずに隠蔽されます。隠し変数は、サブクラス内のビューから効果的にマスクされます。
隠し値
例に戻ると、Son での me の宣言により、Son から継承された me 変数が非表示になります。お父さん。ただし、Dad の隠し変数は値「dad」を保持し、printMe() メソッドでアクセスして出力されます。
代替ソリューション
"son" の出力で望ましい結果を達成するための別のアプローチは、子クラスのコンストラクター内で定義されたインスタンス変数 (非静的変数) を利用することです。このメソッドを使用すると、スーパークラスのクラス変数に影響を与えることなく、サブクラスが独自の独自の ID を持つことができます。
結論
本質的に、クラスをオーバーライドするための直接的なメカニズムはありません。 Java の変数。サブクラスとそのスーパークラスの関係には隠蔽と継承が含まれており、親クラスの元の値を変更せずにサブクラスが独自の固有の特性を持つことができます。個別の ID が必要な場合は、インスタンス変数を使用すると、より適切なソリューションが提供されます。
以上がJava サブクラスが独自の変数ではなく親クラスの静的変数を出力するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。