首頁 > Java > java教程 > Java子類別可以重寫成員變數嗎?

Java子類別可以重寫成員變數嗎?

DDD
發布: 2024-12-18 18:15:10
原創
944 人瀏覽過

Can Java Subclasses Override Member Variables?

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板