2012-12-04 87 views
10

我有一個問題,關於這個代碼就在這裏多態性和靜態方法

public Car { 
    public static void m1(){ 
     System.out.println("a"); 
    } 
    public void m2(){ 
     System.out.println("b"); 
    } 
} 

class Mini extends Car { 
    public static void m1() { 
     System.out.println("c"); 
    } 
    public void m2(){ 
     System.out.println("d"); 
    } 
    public static void main(String args[]) { 
     Car c = new Mini(); 
     c.m1(); 
     c.m2();  
    } 
} 

我知道,多態性不能用靜態方法的工作,只爲實例方法。而且這個覆蓋不適用於靜態方法。

因此,我認爲這個程序應該打印出來:C,d

因爲C調用M1的方法,但它是靜態的,所以它不能重寫,並調用類小型而不是汽車的方法。

這是正確的嗎?

然而,我的書說,答案應該是:一,d

是一個錯字?因爲我現在有點困惑。

請清除此,謝謝。

回答

26

因爲c調用m1方法,但它是靜態的,所以它不能重載,它調用Mini類中的方法而不是Car。

這完全是倒退。

c宣佈通過c提出將調用Car定義的方法Car,所以靜態方法調用。
編譯器將c.m1()直接編譯爲Car.m1(),但不知道c實際上保留了Mini

這就是爲什麼你不應該通過像這樣的實例調用靜態方法。

+4

+1對於*這就是爲什麼你不應該通過像這樣的實例調用靜態方法。* – Joffrey