10個Java抽象類和介面的面試題
1. Java抽象類可以有建構函式嗎?
可以有,抽象類可以宣告並定義建構函式。因為你不可以建立抽象類的例項,所以建構函式只能通過建構函式鏈呼叫(Java中建構函式鏈指的是從其他建構函式呼叫一個建構函式),例如,當你建立具體的實現類。現在一些面試官問,如果你不能對抽象類例項化那麼建構函式的作用是什麼?好吧,它可以用來初始化抽象類內部宣告的通用變數,並被各種實現使用。另外,即使你沒有提供任何建構函式,編譯器將為抽象類新增預設的無引數的建構函式,沒有的話你的子類將無法編譯,因為在任何建構函式中的第一條語句隱式呼叫super(),Java中預設超類的建構函式。
2. Java抽象類可以實現介面嗎?它們需要實現所有的方法嗎?
可以,抽象類可以通過使用關鍵字implements來實現介面。因為它們是抽象的,所以它們不需要實現所有的方法。好的做法是,提供一個抽象基類以及一個介面來宣告型別 。這樣的例子是,java.util.List介面和相應的java.util.AbstractList抽象類。因為AbstractList實現了所有的通用方法,具體的實現像LinkedList和ArrayList不受實現所有方法的負擔,它們可以直接實現List介面。這對兩方面都很好,你可以利用介面宣告型別的優點和抽象類的靈活性在一個地方實現共同的行為。Effective Java有個很好的章節,介紹如何使用Java的抽象類和介面,值得閱讀。
3. Java抽象類可以是final的嗎?
不可以,Java抽象類不能是final的。將它們宣告為final的將會阻止它們被繼承,而這正是使用抽象類唯一的方法。它們也是彼此相反的,關鍵字abstract強制繼承類,而關鍵字final阻止類被擴張。在現實世界中,抽象表示不完備性,而final是用來證明完整性。底線是,你不能讓你的Java類既abstract又final,同時使用,是一個編譯時錯誤。
4. Java抽象類可以有static方法嗎?
可以,抽象類可以宣告並定義static方法,沒什麼阻止這樣做。但是,你必須遵守Java中將方法宣告為static的準則,因為在面向物件的設計中是不受歡迎的,因為Java中的static方法是不可以被過載的。在抽象類中看到static方法是罕見的,但正如我所說的,如果你有很好的理由這樣做的話,那沒有什麼可以阻止你。
5. 可以建立抽象類的例項嗎?
不可以,你不能建立Java抽象類的例項,它們是不完全的。即使你的抽象類不包含任何抽象方法,你也不能對它例項化。將類宣告為abstract的,就等你你告訴編譯器,它是不完全的不應該被例項化。當一段程式碼嘗試例項化一個抽象類時Java編譯器會拋錯誤。
6. 抽象類必須有抽象方法嗎?
不需要,抽象類有抽象方法不是強制性的。你只需要使用關鍵字abstract就可以將類宣告為抽象類。編譯器會強制所有結構的限制來適用於抽象類,例如,現在允許建立一些例項。是否在抽象類中有抽象方法是引起爭論的。我的觀點是,抽象類應該有抽象方法,因為這是當程式設計師看到那個類並做假設的第一件事。這也符合最小驚奇原則。
7. Java抽象類和介面有何不同?
這是最重要的經典Java面試題之一。我已經記不清多少次看到這個問題了。這個問題有趣的原因是可以舉出例子。很容易回答核心OOPS的概念,如抽象,封裝,多型和繼承,但是,當涉及到微妙點就是這樣,候選人往往失手。你可以從本文看出抽象類和介面之間的所有語法的差異或者《Java抽象類和介面的面試題》。
8. 何時選用抽象類而不是介面?
這是對之前抽象類和介面對比問題的後續。如果你知道語法差異,你可以很容易回答這個問題,因為它們可以令你做出抉擇。當關心升級時,因為不可能在一個釋出的介面中新增一個新方法,用抽象類會更好。類似地,如果你的介面中有很多方法,你對它們的實現感到很頭疼,考慮提供一個抽象類作為預設實現。這是Java集合包中的模式,你可以使用提供預設實現List介面的AbstractList。
9. Java中的抽象方法是什麼?
抽象方法是一個沒有方法體的方法。你僅需要宣告一個方法,不需要定義它並使用關鍵字abstract宣告。Java介面中所有方法的宣告預設是abstract的。這是抽象方法的例子
public void abstract printVersion();
現在,為了實現這個方法,你需要繼承該抽象類並重載這個方法。
10. Java抽象類中可以包含main方法嗎?
是的,抽象類可以包含main方法,它只是一個靜態方法,你可以使用main方法執行抽象類,但不可以建立任何例項。