首頁 >Java >java教程 >Java 子類別可以重寫成員變量,還是只是隱藏它們?

Java 子類別可以重寫成員變量,還是只是隱藏它們?

Patricia Arquette
Patricia Arquette原創
2024-12-19 22:15:09589瀏覽

Can Java Subclasses Override Member Variables, or Do They Just Hide Them?

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);  // Prints 1
        aRef.identifyClass(); // Prints "I am class A"
        aRef = b;
        System.out.println(aRef.intVal);  // Prints 1
        aRef.identifyClass(); // Prints "I am class B"
    }
}

輸出為:

1
I am class A
1
I am class B

程式碼初始化兩個類別 A 和 B,它們都具有名為 intVal 的成員變數。 B 擴展 A 並重新宣告 intVal 成員變數。當aRef引用變數設定為A的實例時,intVal成員變數被正確存取。但是,當 aRef 設定為 B 的實例時,intVal 成員變數仍然會列印 A 類別中儲存的值。

為什麼會出現這種情況?

成員變數隱藏

在這種情況下,B類中的成員變數intVal並沒有覆寫A類。相反,該變數是隱藏。當變數被隱藏時,子類別既包含超類別的原始屬性,也包含同名的新屬性。

要存取超類別的原始成員變量,可以使用 super.var 或 (( SuperClass)this).var 語法。例如:

// Access the original intVal member variable from the A class
System.out.println(aRef.intVal);

// Use super to access the original intVal member variable
System.out.println(aRef.super.intVal);

要注意的是,隱藏變數不需要是同一型別。它們只是在子類別中共享相同的名稱。這允許您為不同的子類別建立相同屬性的不同實現,從而提供靈活性和程式碼可重複使用性。

以上是Java 子類別可以重寫成員變量,還是只是隱藏它們?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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