2014-04-11 108 views
2

繼承和多態性如何與靜態方法一起工作?有人可以解釋什麼是適當的輸出應該在這裏以及它是如何派生的?靜態方法的繼承和多態性

class A { public static int get() { return 17; } } 
class B extends A { public static int get() { return 42; } } 


Main 
A x = new B(); 
x.get(); 

錯誤消息,

靜態get()方法從A型應以靜態方式

我想我知道如何訪問到它訪問靜態的方式,但是這是從課堂上提問和其排序意味着一個或另一個值將返回

在我們的計劃,我們的類定義:

class A { public static int get() { return 17; } } 
class B extends A { public static int get() { return 42; } } 

和其他地方,我們聲明A x = new B();

什麼號碼將呼叫x.get()回來嗎?

+0

嘗試運行它。 –

+0

作爲Sotirios指出,'A x = new B();'將返回17在'x.get();''B y = new B();'將在'y.get();'返回42; – Matthew

+0

你可以得到一些特殊的軟件,它會告訴你任何Java程序的輸出。它非常適合解決這樣的問題。你只需要給你的程序,你就可以找出程序的輸出結果。我嚴肅地建議使用這種軟件來解決這類問題 - 這將爲您節省大量時間。你可以爲自己找到答案,而不必信任你從未見過的人。如果你想知道這個驚人的軟件叫做什麼......它是「Java」。嘗試一下。 –

回答

5

的調用將返回int價值17

static方法是不能繼承的。

static方法結合並調用基於它們被調用的表達式的類型。

所以

x.get(); 

其中xA類型的調用A的實現。另請注意,static方法不需要調用實例。

這些也會起作用。

((A) null).get(); 
A.get(); 
... 
public static A someMethod() {} 
... 
someMethod().get(); 

你那裏得到的消息是警告,而不是錯誤。

3
static methods are not inherited. 

靜態方法屬於類,而不是對象。他們屬於 該類,因此不適合多態行爲

覆蓋取決於擁有一個類的實例。多態性的要點是,你可以繼承一個類的子類,並且實現這些子類的對象對於在超類中定義的相同方法(並在子類中重寫)將具有不同的行爲。靜態方法不與任何類的任何實例關聯,因此這個概念不適用。

推動Java設計的兩個因素影響了這一點。 其中一個問題是性能問題:Smalltalk對它的速度太慢了(垃圾收集和多態調用是其中的一部分),Java的創建者決心避免這種情況。另一個決定是Java的目標受衆是C++開發人員。讓靜態方法的工作方式有着對C++程序員熟悉的好處,而且速度也非常快,因爲沒有上級類層次結構來確定要調用哪種方法,而是直接進入類並調用指定的方法。

參見this page