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中文網其他相關文章!