1. 程式人生 > >如何在Java中選擇介面和抽象類

如何在Java中選擇介面和抽象類

什麼是抽象類?

摘要意味著某些東西不是完全具體的 - 它只是一個想法或某事的要點。因此,當我們討論抽象類時,它意味著一個本身沒有具體實現的類。這只是為其他具體類建立的結構或指南。我們可以說抽象類是具體類的靈魂。這就是我們“擴充套件”抽象類的原因。抽象類應該只有那些屬性和方法,沒有它們就不能存在具體的類。

這就是Java不支援抽象類的多重繼承的原因。因為一個具體的類只能表現(或佔用所有屬性)只有一個抽象類(顯然,一個體不能有兩個靈魂)。

例如,  Man 並且  Car 有許多常見的行為,例如運動,創造聲音等,但是一個  

Car 類只能表現得像  Vehicle一個人,而不是一個人,而且這個  Man 類只能表現得像人,而不是車輛。

我同意上面的例子是蹩腳的,但即使在現實生活場景中,如果你不確定你應該繼承哪個抽象類,或者你認為需要繼承多個抽象類,那麼這是一種設計氣味,並且你應該重新審視你的專案設計。

基於我們上面討論的內容,我們需要建立一個  Vehicle 抽象類。這個抽象類將具有Engine,Shape等屬性  Car 和相關方法。我們增加   Engine 

和  Shape 在抽象類,因為可以在沒有這兩個不存在車輛。

抽象 類 車輛 {
  私有 String  引擎 ;
  abstract  void  startEngine();
  abstract  void  stopEngine();
}


什麼是介面?

介面是不同系統之間的行為契約。在Java介面中,我們定義了一個類的行為,它將實現這個介面。

一個類可以有許多不同的行為,這就是Java允許我們“實現”N個介面的原因。介面僅用於提供行為。這就是為什麼Java命名約定建議使用形容詞作為介面的名稱。

例如,汽車可以移動,因此我們可以建立一個可移動的介面並在我們的Car班級中實現它  漂移和喇叭行為也是如此。這些是Car方法的行為  ,而不是內建屬性。一  Car 會車,即使它不能移動。

interface  Movable {
  void  move();
}


令人遺憾的是,我們習慣於在幾乎忘記抽象類的功能,它們的使用以及建立它們的意圖的層面上使用介面。

與汽車類建立相關的虛擬Java程式碼

class  Car  extends  車輛 工具 Movable {

  @覆蓋
  void  startEngine(){
    系統。出。println(“啟動汽車引擎”);
  }

  @覆蓋
  void  stopEngine(){
    系統。出。println(“停止汽車引擎”);
  }

  @覆蓋
  public  void  move(){
    系統。出。println(“動車”);
  }
}


摘要

抽象類建立相關的關鍵要點

  • 在為具體類提供準則時建立抽象類。

  • 抽象類建立與您是否要提供任何方法的實現完全無關。

  • 僅將這些屬性和行為新增到抽象類中,否則您的具體類將失去其存在。例如,  Vehicle 沒有引擎就不能存在。

介面建立相關的關鍵要點

  • 建立為您的具體類提供附加行為的介面。當我們將這些介面共享到外部系統時,它就變成了契約,這就是為什麼我們說介面是具體類的行為契約。

  • 這些行為不應該是您的課程必需的。這些行為應該為您的類新增更多功能。例如,  即使它不能移動,也Car 將是a  Car

  • 問一個問題,每當具體類實現你的介面時,它是否需要你的介面中提到的所有行為,或者只需要幾個?在多個介面中重構您的介面,直到上述問題的答案為是。

謝謝閱讀!