2016-01-11 18 views
0

讓我們假設我有2個班級。爲什麼它允許通過引用一個類的實例來調用靜態方法?

父類:

public class ParentClass { 
    public static void getInstance(){ 
     System.out.println("Parent method"); 
    } 

} 

ChildClass:

public class ChildClass extends ParentClass { 
    public static void getInstance(){ 
     System.out.println("child method"); 
    } 
public static void main(String args[]){ 
    ParentClass pc=new ChildClass(); 
    pc.getInstance(); 
} 
} 

,你這兩類上述通告呼籲getInstance()和Java和許多其他語言的靜態方法,如果有一個繼承方法,並且在子類中有相同的方法,那麼執行的方法就是在子類中的方法。

問題是:爲什麼pc.getInstance();調用父類中的方法?是啊沒有方法重寫靜態方法,但任何人都可以請解釋更多的電腦實例的怪異行爲,爲什麼它引用父方法,即使它指向子類? 爲什麼它可以通過引用一個類的實例來調用一個靜態方法?

感謝

+0

更改'ParentClass pc = new ChildClass();'到'ChildClass pc = new ChildClass();'看看會發生什麼。 –

+0

子類中的靜態方法僅隱藏父級靜態方法。在靜態方法中沒有方法重寫 – awsome

+0

編輯過........ –

回答

4

有靜態方法沒有方法重載。用於調用方法的實例的靜態類型(在您的示例中爲ParentClass)決定調用哪個方法。

除此之外,使用實例引用來調用靜態方法是不好的做法。您應該使用ClassName.methodName()來執行靜態方法。

+0

是啊沒有方法重寫靜態方法,但是請您更詳細地解釋pc實例的行爲,以及爲什麼它會引用父方法甚至是tho它指向兒童班? 謝謝 –

+0

@AhmadAlsanie'pc'的靜態(編譯時)類型是'ParentClass'。因此'pc.getInstance();'相當於'ParentClass.getInstance();'。即使'pc'爲空,這也可以工作。這是靜態方法調用的行爲。 – Eran

+0

是的,我明白,但我的問題是爲什麼!爲什麼它的設計就像這樣? –

相關問題