首頁 > Java > java教程 > 為什麼Java的靜態變數繼承會產生意想不到的結果?

為什麼Java的靜態變數繼承會產生意想不到的結果?

Mary-Kate Olsen
發布: 2024-12-01 19:10:12
原創
762 人瀏覽過

Why Does Java's Static Variable Inheritance Produce Unexpected Results?

Java 類別變數覆蓋難題

考慮以下 Java程式碼片段:

<br>class爸爸{<pre class="brush:php;toolbar:false">protected static String me = "dad";

public void printMe() {
    System.out.println(me);
}
登入後複製

}

class Son 擴充了爸爸{

protected static String me = "son";
登入後複製

}

}

public void doIt() {
new Son().printMe();
登入後複製


}

程式碼似乎在「Dad」和「Son」類別中定義了一個名為「me」的類別變數。當呼叫“doIt()”時,人們可能會期望程式碼列印“son”,因為“Son”是“Dad”的子類別。然而,事實並非如此。

為什麼「doIt()」會印「dad」?

在 Java 中,類別變數不能被覆寫。相反,它們是隱藏的。具體來說,當在子類別中宣告具有現有名稱的類別變數時,子類別會隱藏繼承的類別變量,從而有效地建立一個與其父類別同名但不同的新類別變數。

重寫與隱藏

覆蓋涉及為子類中的方法提供不同的實現,以覆蓋超類中的方法。相較之下,隱藏涉及在子類別中使用相同的變數名,但它隱藏了從超類別繼承的變量,並在子類別中本地創建一個新變數。

如何列印「son」?

為了實現列印「son」的所需行為,不能覆寫類別變數。相反,可以使用其他繼承技術,例如:
  • 在子類別中使用不同的變數名稱,例如“myName”而不是“me”。
  • 修改繼承的類別使用反射的變數(不建議一般使用此方法)。
  • 將數值作為建構子參數傳遞,如範例所示:

有建構子參數的範例:


公用類別Person {
private String name;

public Person(String name) {
    this.name = name;
}

public void printName() {
    System.out.println(name);
}
登入後複製


}

在這個範例中,類別「Person」有一個設定名稱的建構子。這允許創建“Person”的子類別並傳遞名稱的特定值。

以上是為什麼Java的靜態變數繼承會產生意想不到的結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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