2015-08-16 143 views
1

下面的代碼無法編譯:父類中的靜態方法不允許子添加非靜態方法?

public class Child extends Parent{ 

    void foo() {   
    } 
} 

class Parent{ 
    public static void foo(){} 
} 

爲什麼我不能在我的子類中聲明的非靜態方法?在這種情況下,由於方法是靜態的,所以不允許重寫,那麼爲什麼編譯器不允許我們聲明實例方法?

+2

如果允許這樣做,new Child()。foo()會做什麼? –

+0

[JLS§8.4.8.1](https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.4.8.1):「這是一個編譯時錯誤如果一個實例方法_overrides_一個靜態方法。「 – Seelenvirtuose

回答

3

因爲子類固有來自父類的所有方法和字段。在這種情況下,在Child類中將會有兩個Child#foo()方法,因爲如果已經編譯過,它將不會被覆蓋。

+0

好的,明白了..謝謝你的支持:) – Harinder

3

這種方法具有相同簽名的靜態方法,因爲你can't override static methods(它是仍然Parent的一部分,這Child仍然得到),你不能宣佈另一foo在一個相同的簽名孩子的方法。

更技術,the JLS specifies

它是一類的主體中的編譯時錯誤兩種方法使用倍率相當於簽名聲明爲成員(§8.4.2)。

如果您更改了簽名;也就是說,如果你在子類的方法中聲明瞭一個參數,那麼它就沒問題。

+1

我知道,我有時候會挑剔,對不起。但引用的JLS段不是正確的。它處理_same_類中兩個_declared_方法的情況。這裏的情況是我們在父類中有一個方法,而在子類中有另一個方法。所描述的編譯器錯誤由[JLS§8.4.8.1](https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.4.8.1)處理。 – Seelenvirtuose

1

在覆蓋它們時,不能更改對繼承方法的訪問 - 靜態保持靜態。 當在單個類中重載方法時適用同樣的東西 - 您可以使用相同的方法名稱,但方法需要接受不同的參數。

1

因爲孩子從父母和自己識別foo()。所以你不能用你當前的代碼創建。但是,你可以在你的孩子申報的新富()這樣的:

public class Child extends Parent{ 


    public static void foo() { 
    } 
} 

class Parent{ 
    public static void foo(){ 
    } 
} 

更多細節在這裏:你可以寫在具有相同簽名的一個超類中的子類一個新的靜態方法,從而隱藏它http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html