ホームページ >Java >&#&チュートリアル >Java でメンバー変数をオーバーライドすると変数の隠蔽が発生するのはなぜですか?

Java でメンバー変数をオーバーライドすると変数の隠蔽が発生するのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-20 20:02:10373ブラウズ

Why Does Variable Hiding Occur When Overriding Member Variables in Java?

Java での変数の隠蔽の微妙な違いを明らかにする

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。