Java での変数のオーバーライド: より深い探索
Java でのメンバー関数のオーバーライドはよく知られた概念です。ただし、メンバー変数をオーバーライドして実験すると疑問が生じます。次のコードを考えてみましょう:
public class A { public int intVal = 1; public void identifyClass() { System.out.println("I am class A"); } } public class B extends A { public int intVal = 2; public void identifyClass() { System.out.println("I am class B"); } } public class MainClass { public static void main(String [] args) { A a = new A(); B b = new B(); A aRef; aRef = a; System.out.println(aRef.intVal); aRef.identifyClass(); aRef = b; System.out.println(aRef.intVal); aRef.identifyClass(); } }
不可解な動作は出力にあります:
1 I am class A 1 I am class B
aRef が b を指しているとき、なぜ intVal は 1 のままですか?
変数の非表示を明らかにする
機能に反してオーバーライド、変数のオーバーライドはできません。代わりに、Java は「変数隠蔽」として知られる概念を採用しています。サブクラスで同名の変数が宣言されている場合、サブクラスのスコープ内でスーパークラスの変数がマスクされます。
この例では、クラス B が intVal = 2 を宣言しています。これは変数と重複しますが、クラス A では、それはオーバーライドされません。両方の変数がタイプ B のオブジェクトに共存します。
スーパークラス変数へのアクセス
スーパークラスから変数にアクセスするには、次の 2 つのオプションがあります:
たとえば、aRef.super.intVal は 2 を取得します。 、クラス B の intVal。
に隠れている変数実践
変数の非表示は、特定のシナリオで役立つ場合があります。たとえば、すべてのサブクラスが継承する共通のプロパティを持つ基本クラスを定義し、必要に応じて特定のプロパティを選択的にオーバーライドできます。ただし、混乱や潜在的なエラーを避けるために、この手法を慎重に使用することが重要です。
以上がJava サブクラスは本当にインスタンス変数をオーバーライドできますか、それとも何か他のことが関係しているのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。