JavaRush /Java Blog /Random-TW /Java 開發者訪談問答分析。第三部分

Java 開發者訪談問答分析。第三部分

在 Random-TW 群組發布
你好!正如沒有特殊訓練就不可能學會駕駛飛機一樣,如果不花大量時間學習必要的理論基礎,也不可能成為 Java 開發人員。今天我們將致力於此:我們將繼續分析Java 開發人員的250 多個面試問題,並給出相應的答案。以下是第一部分第二部分的分析。是的,當然,如果沒有這些問題,您就可以成為優秀的 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類似的引用,但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 中, implementsextendsJava 開發者訪談問答分析。 第 3 - 2 部分關鍵字負責多型性。 實作- 當我們建立介面時,我們在某個類別中實現其可能的形式之一,但這不是唯一的形式,不是嗎?讓我們記住實作工具是什麼樣的:
public class Cat implements Animal
Cat類別中,我們必須實作Animal介面中提供的所有抽象方法。繼承也是如此:在後代類別中,我們可以重寫方法的現有實作。例如:多個後代 -> 同一方法的多個不同重寫。好吧,要么超類別是抽象的,並且它有某種需要為其每個後代以特殊方式實現的方法。也就是說,我們可以說該方法將採取多種形式。另外, @Override註解可以幫助我們實作 this ,它被放置在實作的方法之上,並指示我們想要實作或覆寫(如果超類別中已經存在該實作)超類別或介面的一個或另一個方法。它是可選的,用於更容易檢測錯誤。使用此註釋,您向編譯器表明您想要重寫/實作超類別/介面方法,它將確保您不會在方法簽章中犯錯。

23.什麼是實體?舉例說明

SOLID是物件導向程式設計的五項基本設計原則的縮寫,由 Robert Martin 創造。 S - Single-responsibilityprinciple-單一責任原則,它規定一個類別應該只有一個目標和單一目的。也就是說,您不應該建立做所有事情的類別。在這種情況下,您可以重現“神聖物件”反模式。如果您有一個Cat對象,它應該包含僅與其內部功能互動的方法,而不包含與此實例無關的業務邏輯。例如,在某處以某種方式保存這種類型的物件。這種外部功能(相對於Cat)需要轉移到其他類,而一些服務的任務是為這種類型的物件提供業務邏輯。 O - 開閉原則-開放/封閉原則。這意味著軟體實體(類別、介面)應該對擴充開放,但對修改關閉。例如,我們需要與現有Cat類別的功能類似的功能,但略有不同。我們不改變Cat類別的功能,破壞已經使用它的地方,而是使用繼承或組合。結果,我們透過修改Cat類別的功能實現了我們的目標,但同時我們沒有改變它或破壞任何東西。 L - Liskov 替換原則- Barbara Liskov 的替換原則。該原則指出,使用基底類型的函數應該能夠在不知情的情況下使用基底類型的子類型。例如,我們的Cat類別應該與其任何後代(例如Lion )互換,而不會從根本上改變行為。一般邏輯(行為)保持不變,但這個或那個功能的實作細節發生了變化。 I - Interface Segregation Principle——介面分離的原則。這項原則指出,擁有許多專用(狹隘的)介面比擁有一個通用介面更好。例如,使用者實作了某個接口,他只需要這個方法,但是這個接口還有九個方法,這些方法與所需方法的邏輯無關。在這種情況下,用戶將需要實作十個介面方法,其中九個對他來說是不必要的!相反,最好製作十個不同的接口,以便在必要時可以實現。好吧,或者不是十個,而是幾個,其中將具有與介面的共同目的密切相關的方法。 D - 依賴倒置原則——依賴倒置原則。此原則規定較高等級的模組不應依賴較低等級的模組。這項原則也被描述為「抽像不應該依賴細節,細節應該依賴抽象」。也就是說,我們必須透過引用介面來建構邏輯,然後才將特定物件傳遞給該功能,該功能的類別實作所需的介面。例如,如果我們有一個Cat介面及其一些實現,例如LionHomeCat,我們將專門使用Cat介面類型來建構互動邏輯,然後才替換LionHomeCat的特定實現,但反之則不然。

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

我們記得,Java 是一種 OOP 語言。也就是說,Java 程式是建立在物件之間的互動之上的。事實證明,該程式就像一個蟻丘,其中每隻螞蟻都是一個物件。Java 開發者訪談問答分析。 第 3 - 3 部分物件是一些分組數據,其中包含與這些內部數據互動的各種方法(函數)。類別是指令,是創建物件的模板也就是說,可以有許多根據相同指令建構的對象,填充有不同或相同的資料值。舉個生活中的例子,我們可以說類別是一棟建築物的圖,而物件是根據這張圖專門創建的建築物。 介面與類別類似,不同之處在於不能使用它們來創建物件。他們的目標是為 Java 添加抽像元素。更準確地說,是為了增加類別和物件之間關係的靈活性。我們所說的靈活性是指前面描述的多態性和抽象性,這反過來又為建立應用程式的內部架構提供了許多機會。

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

Java 開發者訪談問答分析。 第 3 - 4 部分POJO - 普通舊 Java 物件- 一個好的舊 Java 物件:一個類別的簡單對象,不是從任何特定類別繼承的,並且不會實作超出業務模型所需的任何服務介面。換句話說, POJO類別只是一個沒有特殊要求的類別。唯一的要求是沒有與特定框架相關的各種花里胡哨的東西。通常,此類類別不會從其他類別繼承(除了來自同一套件的POJO類別),不實作介面 - 有時標準庫中的標記介面(例如SerializedCloneable)會例外- 不使用註解並且不依賴第三方程式庫。但我注意到POJO可以具有帶有業務邏輯的方法和任何類型的建構子。如果您允許註釋不會更改類別的語義(沒有註釋,物件的目的及其操作的邏輯將不會改變),POJO還可以包含從XMLJSON反序列化的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. 最終類別不會被繼承。
  4. 最終方法不會被重寫(但它們可以被繼承和重載)。
  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
方法簽名與傳回類型和拋出的例外清單相結合,稱為方法契約。這就是今天的全部內容。回頭見!Java 開發者訪談問答分析。 第 3 - 6 部分
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION