Java でメンバー関数をオーバーライドする概念を探索しながら、メンバー変数のオーバーライドを試してみることにしました。そのために、次のクラス構造を作成しました。
class A { public int intVal = 1; } class B extends A { public int intVal = 2; } 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.intVal が 1 のままである理由について混乱を表明しました。この謎を解明するには、提示したシナリオでは、変数の隠蔽ではなく、変数の隠蔽を扱っていることを理解してください。 overriding.
Java では、スーパークラスとサブクラスで同じ名前の変数を持つことができます。この変数隠蔽手法は、スーパークラス変数を効果的に隠蔽します。ただし、どちらの変数もそれぞれのクラス内で独立して存在し続けます。
スーパークラスの参照から変数にアクセスすると、スーパークラス変数と対話することになります。参照自体は、それが指すオブジェクトのクラスの影響を受けません。したがって、aRef がクラス B のインスタンスを指している場合でも、aRef が属するクラスはクラス A であるため、クラス A から intVal 変数にアクセスします。
サブクラス (B) から intVal 変数にアクセスするには、次のようにします。スーパークラスを参照する super キーワードを利用できます。このアプローチにより、スーパークラスとサブクラス内の同じ名前の変数を区別できるようになり、曖昧さが解消されます。
以上がJava でメンバー変数をオーバーライドすると変数の隠蔽が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。