ホームページ > Java > &#&チュートリアル > Java サブクラスはメンバー変数をオーバーライドできますか?

Java サブクラスはメンバー変数をオーバーライドできますか?

DDD
リリース: 2024-12-18 18:15:10
オリジナル
946 人が閲覧しました

Can Java Subclasses Override Member Variables?

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); // Output: 1
        aRef.identifyClass(); // Output: "I am class A"
        aRef = b;
        System.out.println(aRef.intVal); // Output: 1
        aRef.identifyClass(); // Output: "I am class B"
    }
}
ログイン後にコピー

このコードは、オーバーライドされたメンバー変数の動作を示すことを目的としています。ただし、謎があります。intVal が 2 である aRef が b に設定された後でも、aRef.intVal はなぜ 1 を返すのでしょうか?

その答えは、変数の隠蔽の概念にあります。サブクラスがスーパークラス内の変数と同じ名前の変数を宣言すると、スーパークラスの変数が「隠蔽」されます。これは、サブクラスには 2 つの変数があることを意味します。1 つはスーパークラスからのもので、もう 1 つは独自の定義からのものです。

上記のコードでは、intVal メンバー変数が A と B の両方で宣言されています。したがって、B が作成されると、これには両方の intVal があります。1 つは A から継承された値 1 で、もう 1 つは B で定義された値 2 です。

aRef が a に設定されている場合、それは以下を参照します。 A の intVal。aRef が b に設定されている場合でも、A の intVal を参照します。これは、式 aRef.intVal では、aRef が型 A に解決され、intVal が A の変数であるためです。

B の intVal にアクセスするには、((B)aRef).intVal を使用する必要があります。これは、aRef を型 B に明示的にキャストし、B へのアクセスを許可します。変数。

以上がJava サブクラスはメンバー変数をオーバーライドできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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