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); // Output: 1 aRef.identifyClass(); // Output: "I am class A" aRef = b; System.out.println(aRef.intVal); // Output: 1 aRef.identifyClass(); // Output: "I am class B" } }
このコードは、オーバーライドされたメンバー変数の動作を示すことを目的としています。ただし、謎があります。intVal が 2 である aRef が b に設定された後でも、aRef.intVal はなぜ 1 を返すのでしょうか?
その答えは、変数の隠蔽の概念にあります。サブクラスがスーパークラス内の変数と同じ名前の変数を宣言すると、スーパークラスの変数が「隠蔽」されます。これは、サブクラスには 2 つの変数があることを意味します。1 つはスーパークラスからのもので、もう 1 つは独自の定義からのものです。
上記のコードでは、intVal メンバー変数が A と B の両方で宣言されています。したがって、B が作成されると、これには両方の intVal があります。1 つは A から継承された値 1 で、もう 1 つは B で定義された値 2 です。
aRef が a に設定されている場合、それは以下を参照します。 A の intVal。aRef が b に設定されている場合でも、A の intVal を参照します。これは、式 aRef.intVal では、aRef が型 A に解決され、intVal が A の変数であるためです。
B の intVal にアクセスするには、((B)aRef).intVal を使用する必要があります。これは、aRef を型 B に明示的にキャストし、B へのアクセスを許可します。変数。
以上がJava サブクラスはメンバー変数をオーバーライドできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。