Java面試題:多繼承
Java是否支持多重繼承?
好了,很明顯傳統意義上Java並沒有多繼承,所以正確的答案應該是:“沒有”或者“有,但是”或者“沒有,但是”。單從這點就可以探索出不同的方法來。通常我會問“是否因Java語言的設計者笨到沒法實現多重繼承”作為我們話題的開始,為什麽C++那幫家夥實現了呢?我主要以菱形繼承問題來說明:
在面向對象的編程語言中總伴隨著多重繼承及組織的理解。菱形繼承問題就是在如下情景時出現含糊不清的情況:當兩個類B和C繼承自A,類D同時繼承自B和C,如果D中的一個方法調用一個在A中定義的方法(不是覆蓋方法).而B和C分別用不同地方式重寫(overridden)了方法,那麽這個方法到底是繼承的哪個類呢,B還是C?
另一探索性的方法是:Java怎麽模擬“多重繼承”?我想答案已經浮出水面了,就是接口(Interface)。我們經常在Java中討論接口,那麽應試者在什麽時候,怎麽使用接口的呢?使用接口又有什麽好處呢?應試者是否喜歡使用接口?我可以檢測他對建模有多熟練,有時還會讓他針對接口畫畫圖。我們繼續談論Java中接口的問題,當兩個接口有相同的靜態域(field),有一個類實現了Java中所謂的“多繼承”的兩個接口時會出現什麽情況?
public interface I1 {
String NAME = "codemonkeyism";
}
public interface I2 {
String NAME = "stephan";
}
public class C implements I1, I2 {
public static void main(String[] args) {
System.out.println(NAME);
}
}
Java堅持了他們的做法,語言的設計者決定不讓其編譯通過。
C.java:3: reference to NAME is ambiguous, both variable NAME
in I1 and variable NAME in I2 match
System.out.println(NAME);
^
1 error
還有更多的方法和我們的應試者去探討多繼承的問題,例如:接口中方法的修飾符是什麽?對於菱形繼承問題使用traits實現混合結構是否比使用接口更好,還是和多繼承一樣的糟糕?正如我不在那麽鐘愛繼承一樣,大量使用繼承是一種代碼異味。我們還可以和應試者討論繼承的負面因素—–重耦合的例子。
為什麽會有這問題?
我為什麽會問這個問題呢,從這個問題中又學到了什麽?繼承在面向對象(OO)中是很基礎的概念,是每個Java程序員都應該理解的概念。同時也是他反映到工作中,理解超出語法層面的另一個基本的特性。所以對於多繼承問題,我喜歡那些可以引出很多可以探討與思考的問題。這個繼承問題只是多繼承、語言設計、代碼味道、解決方案、接口、基於角色的開發等眾多問題中的一種而已。
英文原文:Codemonkeyism
編譯:ImportNew - 劉誌軍
譯文鏈接: http://www.importnew.com/567.html
Java面試題:多繼承