CodeGym /Java Blog /Toto sisi /探索 Java 開發人員職位面試中的問題和答案。第三部分
John Squirrels
等級 41
San Francisco

探索 Java 開發人員職位面試中的問題和答案。第三部分

在 Toto sisi 群組發布
你好!正如沒有特殊訓練就不可能學會如何駕駛飛機一樣,如果不花大量時間學習必要的理論基礎,就無法成為 Java 開發人員。這正是我們今天要解決的問題:我們將繼續探討 Java 開發人員在面試過程中遇到的問題,當然,我們也會查看答案。以下是本概述的第一 部分和第二 部分。毫無疑問,如果沒有這些問題,您就可以成為優秀的 Java 開發人員。也就是說,如果您對 Java 的所有複雜性有很好的理解,那麼您肯定會具有優勢,並且在未來雇主的眼睛中看起來更有吸引力。 探索 Java 開發人員職位面試中的問題和答案。 第 3 - 1 部分

20. 語言的哪些元素支援封裝?

讓我們回想一下,封裝是隱藏類別的實作細節。也就是說,我們的類別在使用的時候,它的內臟和內部邏輯對外人來說是不明顯的。語言的哪些元素造成了這種情況?當然是存取修飾符!任何我們需要隱藏的內容,我們都用private修飾符進行標記。例如,類別的私有欄位或一些有助於實作某些內部功能的內部方法。對於我們想要提供外部存取的任何內容,我們會新增public存取修飾符。例如,實現某些功能的方法(可能在內部使用許多私有方法),或者當然還有用於存取類別的私有欄位的 getter 和 setter。我們還沒有提到defaultprotected修飾符,它們可以更靈活地使用並專門定制對某些類部分的存取。

21. 語言的哪些元素支援繼承?

繼承是一種允許您基於另一個類別創建類別的機制。Java為此提供了extends關鍵字。例如,假設我們有一個Cat類,並且我們想要建立一個Lion子類別。在程式碼中,它看起來像這樣:
public class Lion extends Cat
而這意味著Lion類別繼承了Cat類別的所有方法和變量,除了靜態變數。語言中負責繼承的另一個元素是super這是一個與此類似的參考。this關鍵字引用它所引用的物件。super關鍵字指的是目前物件的父物件。通常使用super :
  1. 呼叫超類別的建構函數。例如,Cat類別有一個必須在建構函式中初始化的內部名稱變數。Lion類別建構函式中,它將如下所示:

    public Lion(final String name) {
       super(name);
    }

  2. 引用父級的欄位和方法。例如,在Cat類別中,我們有一個初始化的年齡欄位:

    public class Cat {
       int age = 10;

但我們在Lion中有相同的初始化欄位:
public class Lion extends Cat {
   int age = 15;
如果在Lion物件中我們想要引用父物件的Age變量,那麼我們必須透過super來完成:
super.name

22. 語言的哪些元素會導致多態性?

多態性是具有一個簽名的物件具有多種形式(多種實現)的能力。 探索 Java 開發人員職位面試中的問題和答案。 第 3 - 2 部分我們可以自信地說,Java 的implementsextends關鍵字負責多態性。當我們有一個介面時,實作允許我們提供一種可能的實現,但這不一定是唯一的實現,不是嗎?讓我們回顧一下使用Implements的樣子:
public class Cat implements Animal
然後在Cat類別中,我們必須實作Animal介面中的所有抽象方法。繼承也是如此:在子類別中,我們可以重寫方法的現有實作。這意味著對於多個子類,我們可以對同一方法進行多種不同的重寫。或者,超類別可以是抽象的,並且具有必須在其每個子類別中以特殊方式實現的特定方法。換句話說,這個方法會有很多不同的實作。@Override註解也可以幫助我們解決這個問題。它位於已實作的方法之上,表示我們想要實作或覆寫(如果超類別中已存在實作)超類別或介面的特定方法。它是可選的,有助於更輕鬆地檢測錯誤。您使用此註解告訴編譯器您想要重寫/實作超類別/介面方法。然後編譯器將確保您不會在方法簽章中犯錯。

23.什麼是實體?提供例子

SOLID是 Robert Martin 的五個基本 OOP 設計原則的縮寫。 S(單一責任原則):規定一個類別應該只有一個目的/責任。換句話說,您不應該創建做所有事情的類別。如果你這樣做,你可能會重現「God Object」反模式。如果您有一個Cat對象,它應該具有僅與其內部功能互動的方法,但它不應該包含與該實例無關的任何業務邏輯。例如,用於儲存這種類型的物件的某種機制。此功能(位於Cat實體外部)應移至其他類別或服務,其任務是為對應物件提供業務邏輯。 O(開放-封閉原則):此原則描述如下:軟體實體(類別、模組、函數等)應該對擴充開放,並對修改關閉。例如,假設我們需要與現有Cat類別的功能相似但略有不同的功能。我們可以使用繼承或組合,而不是更改 Cat類別的功能,從而破壞已使用的所有程式碼。因此,我們實現了修改Cat類別的功能的目標,並且無需更改類別本身,也不會破壞任何內容。 L(Liskov替換原則):這是Barbara Liskov的替換原則。此原則表示,採用基底類型的函數應該能夠使用該基底類型的子類型,而無需知道發生了什麼。例如,我們的Cat類別應該可以被它的任何後代(例如Lion )替換,而不會從根本上改變它的行為。一般邏輯(行為)保持不變,但特定功能的實作細節發生了變化。 I(介面隔離原則):此原則指出,擁有許多專用(狹隘的)介面比擁有一個通用介面更好。例如,假設開發人員實作了某個介面。他們只需要其中一個方法,但該介面還有九個與所需方法的邏輯無關的方法。在這種情況下,開發人員將需要實作十個介面方法,其中九個對他們來說是多餘的!相反,最好製作十個可以根據需要實現的不同接口。好吧,如果不是十個,那就是幾個,每個方法都與介面的單一用途密切相關。 D(依賴倒置原則) :原則上說高層模組不應該依賴低層模組。該原則還指出,“抽像不應該依賴細節。細節應該依賴抽象。” 我們必須透過引用介面來建構邏輯,並傳遞實作所需介面的類別的具體物件。例如,假設我們有一個Cat介面和一些實現,例如LionHouseCat我們專門建構了與Cat介面互動的邏輯。然後我們才用特定的實作( LionHouseCat )替換接口,而不是相反。

24.什麼是類別、物件和介面?

我們還記得 Java 是一種 OOP 語言。也就是說,Java 程式是基於物件之間的互動而建構的。程式就像一個蟻丘,其中每隻螞蟻都是一個物件。 探索 Java 開發人員職位面試中的問題和答案。 第 3 - 3 部分物件是資料的集合,其中包括用於與內部資料互動的各種方法(函數)。 類別是用於建立物件的指令或範本。這意味著我們可以根據相同的指令建立許多對象,但填充不同(或相同)的資料。舉個現實生活中的例子,我們可以說類別是一棟建築的藍圖,而物件則是根據藍圖專門建造的一棟建築。 介面與類別類似,但我們不能使用它們來建立物件。它們的目的是為 Java 添加抽象。更準確地說,它們為類別和物件之間的關係增加了靈活性。我們所說的靈活性是指前面描述的多態性和抽象性,這為建立應用程式的內部架構創造了許多機會。

25. 什麼是POJO類?舉一個這樣的類別的例子

探索 Java 開發人員職位面試中的問題和答案。 第 3 - 4 部分POJO (普通舊 Java 對象)是一個簡單的類對象,它不繼承任何特定的類,並且不實作超出業務模型所需的任何服務介面。換句話說,POJO類別只是一個沒有特殊要求的類別。唯一的要求是沒有與特定框架相關的各種花里胡哨的東西。通常,這些類別不會繼承其他類別(同一套件中的POJO類別除外),不會實作介面(有時標準庫中的標記介面(例如SerializedCloneable)會例外),不會使用註釋,並且不依賴第三方庫。請注意,POJO可以具有包含業務邏輯和任何類型的建構函數的方法。如果我們允許不改變類別語義的註釋(即,註釋的缺失不會改變對象的目的或邏輯),那麼POJO還可以包含從XML或JSON反序列化的JPA實體和DTO對象規則註釋中指定。關於POJO類別要記住的另一件事是,最好重寫它們的equalshashCode方法,因為這可以幫助它們更好地履行其職責。POJO類別的範例:
public class User {
   private Long id;
   private String firstName;
   private String lastName;
   private Long age;

   public User(final Long id, final String firstName, final String lastName, final long age) {
       this.id = id;
       this.firstName = firstName;
       this.lastName = lastName;
       this.age = age;
   }

   public Long getId() {
       return this.id;
   }

   public String getFirstName() {
       return this.firstName;
   }

   public String getLastName() {
       return this.lastName;
   }

   public Long getAge() {
       return this.age;
   }

   @Override
   public boolean equals(final Object o) {
       if (this == o) return true;
       if (o == null || this.getClass() != o.getClass()) return false;
       final User user = (User) o;
       return Objects.equals(this.id, user.id) &&
               Objects.equals(this.firstName, user.firstName) &&
               Objects.equals(this.lastName, user.lastName) &&
               Objects.equals(this.age, user.age);
   }

   @Override
   public int hashCode() {
       return Objects.hash(this.id, this.firstName, this.lastName, this.age);
   }
}

26. 類別可以包含哪些元素?

一個類別可以包含以下元素:
  • 實例字段;
  • 靜態字段;
  • 初始化塊;
  • 靜態初始化塊;
  • 構造函數(預設總是聲明空構造函數);
  • 方法;
  • 靜態方法;
  • 各種註釋(可應用於類別本身或其組成部分);
  • 仿製藥
  • 其他類別的繼承 ( extends ) 或介面的實作 ( implements )。

27. 告訴我們 Java 中的繼承。super 關鍵字的具體特點是什麼?

上面我之前講過繼承和Java中的super關鍵字。我再提幾個更重要的重點:
  1. 我們只能繼承一個類別:Java 中沒有多重繼承。隨著Java 8中預設方法的出現,這個說法將會變得非常有爭議。
  2. 私有方法和欄位也被繼承。它們根本無法從子類別存取(但是,例如,如果我們有一個私有欄位並且有公共受保護的getter 和 setter,那麼我們可以使用它們來存取該欄位)。
  3. Final類別不能被繼承。
  4. Final方法不能被覆寫(但它們可以被繼承和重載)。
  5. 靜態方法和變數不是繼承的(因為它們附加到類,而不是物件)。
  6. 繼承抽象類別時,必須實作其抽象方法,或者子類別也必須宣告為抽象。
  7. 如果父類別中有非預設建構函數,則必須在子類別中重寫它們(但@Override不寫在它們上面)。
  8. 您可以將存取修飾符擴展到子類別中重寫的方法:private -> default -> protected -> public
  9. 在子類別中重寫的方法可以拋出更窄的異常,例如:Exception -> IOException -> FileNotFoundException。
探索 Java 開發人員職位面試中的問題和答案。 第 3 - 5 部分

28.什麼是方法簽名?提供正確和錯誤簽名的範例

方法簽名 是方法的名稱加上輸入參數的類型(參數的順序很重要)。方法簽名不包括傳回值或方法拋出的例外。正確簽名範例:
doSomething(int, double, double)
錯誤簽名範例:
void doSomething(int firstArg, int secondArg) throws Exception
方法簽名與傳回類型和拋出的例外清單相結合,稱為方法契約。這就是今天的全部內容!回頭見!
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION