ホームページ > Java > &#&チュートリアル > Java サブクラスは本当にインスタンス変数をオーバーライドできますか、それとも何か他のことが関係しているのでしょうか?

Java サブクラスは本当にインスタンス変数をオーバーライドできますか、それとも何か他のことが関係しているのでしょうか?

Barbara Streisand
リリース: 2024-12-16 18:58:12
オリジナル
795 人が閲覧しました

Can Java Subclasses Truly Override Instance Variables, or is Something Else at Play?

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
ログイン後にコピー

aRef が b を指しているとき、なぜ intVal は 1 のままですか?

変数の非表示を明らかにする

機能に反してオーバーライド、変数のオーバーライドはできません。代わりに、Java は「変数隠蔽」として知られる概念を採用しています。サブクラスで同名の変数が宣言されている場合、サブクラスのスコープ内でスーパークラスの変数がマスクされます。

この例では、クラス B が intVal = 2 を宣言しています。これは変数と重複しますが、クラス A では、それはオーバーライドされません。両方の変数がタイプ B のオブジェクトに共存します。

スーパークラス変数へのアクセス

スーパークラスから変数にアクセスするには、次の 2 つのオプションがあります:

  • super.var: これは、変数を明示的に参照します。 superclass.
  • ((SuperClass)this).var: これは、これをスーパークラス型にダウンキャストし、変数にアクセスします。

たとえば、aRef.super.intVal は 2 を取得します。 、クラス B の intVal。

に隠れている変数実践

変数の非表示は、特定のシナリオで役立つ場合があります。たとえば、すべてのサブクラスが継承する共通のプロパティを持つ基本クラスを定義し、必要に応じて特定のプロパティを選択的にオーバーライドできます。ただし、混乱や潜在的なエラーを避けるために、この手法を慎重に使用することが重要です。

以上がJava サブクラスは本当にインスタンス変数をオーバーライドできますか、それとも何か他のことが関係しているのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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