首頁 >Java >java教程 >Java 子類別真的可以重寫實例變數嗎?

Java 子類別真的可以重寫實例變數嗎?

Barbara Streisand
Barbara Streisand原創
2024-12-16 18:58:12797瀏覽

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 類型的物件中。

存取超類變數

要從超類存取變量,有兩個選項:

  • super.var:這顯式引用了來自superclass.
  • ((SuperClass)this).var:這會將this向下轉換為超類別類型,然後存取該變數。

例如,aRef.super.intVal 會擷取 2 ,B類的intVal。

變數隱藏在練習

變數隱藏在某些情況下可能很有用。例如,您可以定義一個具有所有子類繼承的公共屬性的基類,並根據需要選擇性地覆寫某些屬性。然而,明智地使用這種技術以避免混淆和潛在的錯誤非常重要。

以上是Java 子類別真的可以重寫實例變數嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn