ホームページ >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); aRef.identifyClass(); aRef = b; System.out.println(aRef.intVal); aRef.identifyClass(); } }
出力:
1 I am class A 1 I am class B
この例では、intVal 変数は両方のAクラスとBクラス。 B のメンバー変数は、A のメンバー変数を隠します。その結果、aRef が b に設定されている場合、アクセスされる intVal 値は、A の intVal のデフォルト値である 1 のままです。
隠し変数にアクセスするにはスーパークラスの場合は、super.var または ((SuperClass)this).var を使用できます。例:
aRef = b; System.out.println(aRef.intVal); // Outputs 1, the value of A's intVal System.out.println(((A)aRef).intVal); // Outputs 2, the value of B's intVal
aRef をそのスーパークラスに明示的にキャストすることで、非表示のメンバー変数にアクセスできます。
変数を非表示にすることで、サブクラスが同じ名前で独自の変数を定義できることを覚えておいてください。スーパークラス変数ですが、完全にはオーバーライドされません。両方の変数が共存し、サブクラス変数はスーパークラス変数をシャドウします。
以上がJava での変数の隠蔽は関数のオーバーライドとどう違うのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。