ホームページ > Java > &#&チュートリアル > Java での変数の隠蔽は関数のオーバーライドとどう違うのでしょうか?

Java での変数の隠蔽は関数のオーバーライドとどう違うのでしょうか?

Linda Hamilton
リリース: 2024-12-17 08:12:25
オリジナル
337 人が閲覧しました

How Does Variable Hiding in Java Differ from Function Overriding?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート