當子類別定義與其超類別中的成員變數同名的成員變數時,就會發生變數隱藏。與替換實現的函數覆蓋不同,變數隱藏使用同名的新變數來掩蓋超類別變數。
考慮以下 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
在此範例中,intVal 變數在 A 和B類別。 B的成員變數對A隱藏了1,導致當aRef設定為b時,存取的intVal值仍然是1,也就是A的intVal的預設值。
存取隱藏變數對於超類,我們可以使用 super.var 或 ((SuperClass)this).var。例如:
aRef = b; System.out.println(aRef.intVal); // Outputs 1, the value of A's intVal System.out.println(((A)aRef).intVal); // Outputs 2, the value of B's intVal
透過明確地將 aRef 轉換為其超類,我們可以存取隱藏的成員變數。
記住,變數隱藏允許子類別定義自己的同名變數超類別變量,但它不會完全覆蓋它們。兩個變數共存,子類別變數隱藏超類別變數。
以上是Java 中的變數隱藏與函數重寫有何不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!