2016-09-29 217 views
0

我在java中通過覆蓋功能時有一個疑問。靜態方法的繼承和靜態變量繼承有何不同?

考慮下面的代碼:

class Vehicle { 
    static int speed = 50; 

    public static void display() { 
     System.out.println(speed); 
    } 
} 

class Jeep extends Vehicle { 
    int speed = 100; 

    void display() { //GETTING COMPILE TIME ERROR 
     System.out.println(speed);//will print speed of Bike 
    } 

    public static void main(String args[]) { 
     Jeep b = new Jeep(); 
     System.out.println(b.speed); 

    } 
} 

我讀的靜態方法不能被重寫。

但是在上面的代碼中,我在父類Vehicle中聲明瞭一個靜態變量'speed'。並且我在子類中創建了一個名稱爲「速度」的實例變量。我沒有得到任何編譯時錯誤,因爲我更改了子類中靜態變量'speed'的值。

我面臨的編譯時間問題,而試圖重寫顯示方法,雖然我沒有得到任何錯誤,而重新聲明變量「速度」雖然兩者都是在父類的靜態。

可能是什麼原因導致子類的speed變量隱藏了父類的靜態speed變量,但與display方法不一樣,並顯示編譯時錯誤?

+0

你要問哪一個呢?實例字段或方法? '速度'還是'顯示'? (它很重要。) –

+0

你沒有在子類中改變任何靜態變量'speed'? – SomeJavaGuy

+0

字段永遠不能被覆蓋,無論是否爲靜態,所以字段沒有問題。 –

回答

3

static函數不是對象的特定實例的一部分,多態性除非應用於對象,否則沒有多大意義。

這就是爲什麼你不能覆蓋static函數。

1

在代碼中的子類定義與被聲明爲新的字段和在超類中的字段是隱藏的或由子類字段具有相同名稱的陰影換言之相同的名稱(速度)的字段。

甲陰影字段指示它不是由子類繼承代替亞類已宣佈在其範圍相同名稱的字段。

隱藏字段不會影響其在超類中的值。要訪問隱藏字段,只需使用super.fieldname(Vehicle.speed,因爲它是靜態的)。

字段不能超越,但只能隱藏在java中。

領域的陰影,因爲它使代碼的可讀性和混亂被認爲是由許多不好的做法。

至於爲什麼靜態字段不能被覆蓋拔示巴提供了關於你的問題後的出色答卷或引用 Why doesn't Java allow overriding of static methods?