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" } }
程式碼旨在示範重寫成員變數的行為。然而,有一個難題 - 為什麼 aRef 設定為 b(其 intVal 為 2)後 aRef.intVal 仍然返回 1?
答案在於變數隱藏的概念。當子類別宣告一個與其超類別中的變數同名的變數時,它會「隱藏」超類別的變數。這意味著子類有兩個變數:一個來自其超類,一個來自其自己的定義。
在上面的程式碼中,intVal 成員變數在 A 和 B 中都宣告了。因此,當建立 B 時,它有兩個 intVals - 一個從 A 繼承,值為 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中文網其他相關文章!