JavaRush /Java Blog /Random-TW /10 個抽象類別和介面 Java 面試題

10 個抽象類別和介面 Java 面試題

在 Random-TW 群組發布
抽象類別和介面在所有物件導向的程式語言中都非常流行。幾乎在每次 Java 面試中,您都至少會遇到一個與此主題相關的問題。由於介面在軟體設計人員中很受歡迎,因此被更頻繁地提及,但關於抽象類別的問題也時常出現。後者最常被問到初級開發人員職位的申請人,例如,Java 開發經驗不超過兩年的申請人,而在面試那些經驗已經超過四年的人時,最常遇到有關介面的問題。它們通常與有關 Java 設計模式的其他問題一起提出,例如裝飾器或工廠模式。 10 道抽象類別與介面 Java 面試問題 - 1在本文中,我們將討論在各個層級的 Java 面試中提出的有關抽象類別和介面的常見問題。即使對於新手 Java 程式設計師來說,其中大多數也不應該困難。這些大多是純粹的知識問題,但其中一些問題,例如Java 中抽象類別和接口之間的區別,或者何時選擇抽象類別而不是接口,可能相當棘手。我們為您提供了有關該主題的十幾個有趣的問題。
如果您曾經在面試中被問過問題,或者不得不問任何有關抽象類別和介面的有價值的問題,但它不在此列表中,請在評論中分享。

1. Java中抽象類別可以有建構子嗎?

是的,在 Java 的抽象類別中,您可以宣告和定義建構子。由於不可能建立抽象類別的實例,因此只有在形成建構函式鏈時,也就是在建立具體實作類別的實例時,才能呼叫這樣的建構子。但想像一下,面試官隨後問了一個問題:如果無論如何都無法創建抽象類別的實例,那麼建構函數的意義何在?重點是它仍然可以用來設定在抽象類別中聲明並由各種實作使用的公共變數的初始值。即使您沒有聲明任何建構函數,編譯器也會為抽象類別新增預設的無參構造函數。如果沒有它,您的子類別將無法編譯,因為任何建構函式中的第一個語句都是super()Java 中預設超類別建構函式的隱式呼叫。

2、Java中的抽象類別可以實作介面嗎?他們必須實施所有方法嗎?

是的,抽象類別可以使用implements. 由於它們是抽象的,因此不需要它們實作所有方法。建議的做法是使用抽象基底類別和介面來聲明類型。一個例子是介面java.util.List和對應的抽象類別java.util.AbstractList。因為AbstractList它實作了所有通用方法,所以特定實作(例如LinkedListArrayList)不必實作所有方法,就像List直接實作介面的情況一樣。該解決方案結合了使用介面聲明類型的優點和抽象類別的靈活性,可以在一個地方實現所有常見行為。在 Joshua Bloch 的書《Java. 《高效程式設計》中有一個關於在 Java 中使用介面和抽象類別的主題的精彩章節,為了更好地理解,研究它是有意義的。

3.抽象類別可以是final的嗎?

不他不能。該關鍵字final意味著該類別位於層次結構的頂部,並且不能有後代。沒有繼承人的抽象類別就像真空中的球形馬,因為它不可能創建實例abstract class。因此,如果一個類別既是 又是abstractfinal,那麼它沒有後代並且不能被實例化。如果你創建一個類別abstract並且final.

4. Java中的抽象類別可以有靜態方法嗎?

是的,抽象類別可以宣告和定義靜態方法。只需要遵循在 Java 中建立靜態方法的一般原則,因為它們在物件導向的設計中是不可取的,因為在 Java 中重寫靜態方法是不可能的。抽象類別中的靜態方法非常罕見,但如果有充分的理由,沒有什麼可以阻止您使用它們。

5. 是否可以實例化抽象類別?

不,你不能這樣做。抽象類別的本質是它不完整,需要在其後代類別中完成。也就是說,這個類別還沒準備好使用。例如,它可能缺少某些方法的實作。由於類別尚未準備好使用,因此無法建立其物件。但是您可以建立抽象類別的繼承者的實例。如果程式嘗試實例化抽象類,Java 編譯器將會拋出錯誤。

6.抽象類別必須有抽象方法嗎?

不,抽象類別不能有任何抽象方法。abstract在 Java 中,只需在聲明中使用關鍵字即可將類別抽象化。編譯器將強制執行任何結構限制,例如不允許建立此類別的實例化。順便說一句,抽象類別或介面中是否應該有抽象方法的問題是有爭議的。在我看來,抽象類別應該有抽象方法,因為這是程式設計師看到抽象類別時首先想到的。這非常符合盡量減少意外的原則。

7. Java中抽象類別和介面有什麼差別?

這是最重要、也是最經典的Java面試題目之一。我已經數不清在各個級別的Java面試中見過多少次這個問題了。這個問題之所以有趣,特別是因為申請人有機會提供一個例子。回答有關物件導向程式設計基礎知識的問題,例如抽象、封裝、多態性和繼承,很容易,但當涉及到這些微妙的細微差別時,求職者常常會感到困惑,並說出首先想到的事情。 這個問題的答案值得單獨寫一篇文章(特別是在 Java 8 改變之後),但簡而言之:
  • 介面僅描述物件的行為(方法),但它沒有狀態(欄位)(除了public static final),而抽象類別可以擁有它們。

  • 抽象類別是繼承(擴充)的,介面是實作(實作)的。我們可以只繼承一個類,但可以實作任意多個介面。一個介面可以擴充(擴充)另一個介面。

  • 當存在「is-a」關係時使用抽象類,即子類擴展基抽象類,且介面可以由彼此完全不相關的不同類實現。

8. 什麼時候更喜歡抽象類別而不是接口,反之亦然?

這是之前關於抽象類別和介面的問題的延續。如果您知道它們的語法差異是什麼,那麼回答這個問題不會給您帶來問題,因為它們是做出決定的決定性因素。由於幾乎不可能向已發布的介面添加新方法,因此最好使用抽象類,以防可能需要進一步開發。在 Java 中開發抽象類比開發介面更容易。同樣,如果一個介面有太多方法並且實現它們都變得非常令人頭疼,那麼最好為預設實作建立抽象類別。Java 集合包中遵循這種模式,抽象類別AbstractList提供了List. 在以下情況下使用抽象類別:
  • 您希望在幾個密切相關的類別之間共用程式碼。

  • 您可能期望擴展抽象類別的類別具有許多共同的方法或字段,或者需要除public(例如,protectedprivate)之外的存取修飾符。

  • 您想要聲明非靜態或не-final字段。這允許您定義可以存取和更改其所屬物件的狀態的方法。
在以下情況下使用介面:
  • 您期望不相關的類別實作您的介面。例如,介面ComparableCloneable是由許多不相關的類別實現的。

  • 您想要定義特定資料類型的行為,但您不關心由誰實現它。

  • 您想要使用多類型繼承。

9. Java中什麼是抽象方法?

抽象方法是沒有主體的方法。abstract您只需在方法聲明中使用關鍵字來聲明方法而不定義它。預設情況下,Java 語言中介面內宣告的所有方法都是抽象的。以下是 Java 中抽象方法的範例:
public void abstract printVersion();
現在,要實作此方法,您需要擴充抽象類別並重寫此方法。

10. Java中的抽象類別可以包含方法嗎main

是的,Java中的抽象類別可以包含方法main,因為它只是另一個靜態方法,而抽象類別可以使用方法來執行main,只要你不實例化它。這就是我想告訴你的。請記住:抽象類別和介面是物件導向分析和設計過程中的關鍵設計決策,當然,如果您想創建靈活的系統,則應謹慎使用。
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION