ホームページ >Java >&#&チュートリアル >Java サブクラスはメンバー変数をオーバーライドできますか、それとも単に隠すだけですか?
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); // Prints 1 aRef.identifyClass(); // Prints "I am class A" aRef = b; System.out.println(aRef.intVal); // Prints 1 aRef.identifyClass(); // Prints "I am class B" } }
出力は次のとおりです。
1 I am class A 1 I am class B
このコードは、2 つのクラス A と B を、両方とも intVal という名前のメンバー変数で初期化します。 B は A を拡張し、intVal メンバー変数を再宣言します。 aRef 参照変数が A のインスタンスに設定されている場合、intVal メンバー変数は正しくアクセスされます。ただし、aRef が B のインスタンスに設定されている場合でも、intVal メンバー変数は A クラスに格納されている値を出力します。
なぜこれが発生するのですか?
メンバー変数の非表示
この状況では、B クラスのメンバー変数 intVal は intVal メンバーをオーバーライドしていません。 Aクラスの変数。代わりに、変数は非表示です。変数が非表示の場合、サブクラスにはスーパークラスの元のプロパティと同じ名前の新しいプロパティの両方が含まれます。
スーパークラスから元のメンバー変数にアクセスするには、super.var または (( SuperClass)this).var 構文。例:
// Access the original intVal member variable from the A class System.out.println(aRef.intVal); // Use super to access the original intVal member variable System.out.println(aRef.super.intVal);
隠し変数は同じ型である必要はないことに注意することが重要です。これらはサブクラス内で同じ名前を共有しているだけです。これにより、異なるサブクラスに対して同じプロパティの異なる実装を作成でき、柔軟性とコードの再利用性が実現します。
以上がJava サブクラスはメンバー変数をオーバーライドできますか、それとも単に隠すだけですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。