JavaRush /Java Blog /Random-TW /類之間的關係。繼承、組合和聚合

類之間的關係。繼承、組合和聚合

在 Random-TW 群組發布
你好!今天我們來仔細看看物件導向程式設計(OOP)的另一個原則-繼承。同時,我們將研究類別之間其他類型的關係—組合和聚合。這個主題並不困難:您在之前的講座中已經多次遇到繼承及其範例。今天主要是鞏固一下知識,仔細看看繼承機制,再過一次例子:)所以,我們走吧!
類之間的關係。 繼承、組合和聚合 - 1

Java中的繼承及其好處

您可能還記得,繼承是一種允許您基於現有(父)類別描述新類別的機制。在這種情況下,新類別借用了父類別的屬性和功能。讓我們記住之前在講座中繼承的例子:
public class Car {

   private String model;
   private int maxSpeed;
   private int yearOfManufacture;

   public Car(String model, int maxSpeed, int yearOfManufacture) {
       this.model = model;
       this.maxSpeed = maxSpeed;
       this.yearOfManufacture = yearOfManufacture;
   }


public void gas() {
       //...gas
   }

public void brake() {
       //...brake
   }
}


public class Truck extends Car {

   public Truck(String model, int maxSpeed, int yearOfManufacture) {
       super(model, maxSpeed, yearOfManufacture);
   }
}



public class Sedan extends Car {
   public Sedan(String model, int maxSpeed, int yearOfManufacture) {
       super(model, maxSpeed, yearOfManufacture);
   }
}
我們有一個特定的程式來處理各種類型的汽車。即使您不是汽車愛好者,您可能知道世界上有很多類型的相同汽車:)因此,我們將汽車的一般屬性分離到一個共同的父類中 - Car。無論類型為何,所有汽車都有什麼共同點?任何汽車都有製造年份、型號名稱和最高速度。我們將這些屬性放入欄位model, maxSpeed,中yearOfManufacture。至於行為,任何汽車都可以加速和煞車:)我們在方法gas()和中定義這種行為brake()。這帶給我們什麼好處呢?首先,減少程式碼量。當然,我們可以不用父類別。但由於每輛車都必須能夠加速和製動,因此我們必須gas()brake()class Truck、 class Sedan、 class F1Car、 classSportcar以及所有其他類別的汽車中建立方法。想像一下在這種情況下我們將編寫多少額外的程式碼。不要忘記 model、maxSpeed 和yearOfManufacture 欄位:如果我們放棄父類,我們將在每個機器類中建立它們! 類之間的關係。 繼承、組合和聚合 - 2 當我們有幾十個機器類別時,重複程式碼的數量將變得非常嚴重。將公共欄位和方法(也稱為「狀態」和「行為」)移至父類別中將使我們節省大量時間和空間。如果某種類型具有僅該類型獨有的屬性或方法,並且其他類型的機器不存在,那麼這並不重要。它們始終可以在後代類別中創建,與所有其他類別分開。
public class F1Car extends Car {

   public void pitStop() {

       //...only racing cars make pit stops
   }

   public static void main(String[] args) {

       F1Car formula1Car = new F1Car();
       formula1Car.gas();
       formula1Car.pitStop();
       formula1Car.brake();
   }
}
以一級方程式賽車為例。與他們的「親戚」不同,他們有一種獨特的行為——時不時地停下來。這並不困擾我們。我們已經描述了父類別中的一般行為Car,我們可以在類別中加入子類別的特定行為。 類之間的關係。 繼承、組合和聚合 - 3 這也適用於欄位:如果子類別具有獨特的屬性,我們可以在其中平靜地聲明這些欄位而不必擔心:)重複使用程式碼的能力是繼承的主要優點。 對於程式設計師來說,不要編寫不必要的程式碼非常重要。在工作中你會不只一次遇到這種情況。請記住一件非常重要的事情:Java 中沒有多重繼承。每個類別僅繼承自一個類別。我們將在以後的講座中更詳細地討論其原因,但現在請記住。順便說一下,這就是 Java 與其他一些 OOP 語言的區別。例如,C++ 具有多重繼承。透過繼承,一切或多或少都變得清晰了——讓我們繼續前進。

組合和聚合

類別和物件可以相互關聯。繼承描述了“is”(或英語“IS A”)關係。獅子座是一種動物。這種關係可以很容易地使用繼承來表達,其中Animal類別是父類,Lion類別是子類別。然而,並不是世界上所有的關係都是這樣描述的。例如,鍵盤肯定以某種方式連接到計算機,但它不是計算機。手以某種方式與人聯繫在一起,但它們不是人。在這些情況下,它基於不同類型的關係:不是“是”,而是“是一部分”(“HAS A”)。手不是人,卻是人的一部分。鍵盤不是計算機,但它是計算機的一部分。HAS 關係可以使用組合聚合機制在程式碼中進行描述。它們之間的差異在於這些聯繫的「嚴格性」。讓我們舉一個簡單的例子:我們有我們的Car——一輛車。每輛車都有引擎。此外,每節車廂內都有乘客。Engine engine字段和之間的根本區別是什麼Passenger [] passengers?如果汽車內有乘客А,並不代表車內不能B載人C。一輛車可容納多名乘客。此外,如果所有乘客都離開車內,車子仍會安靜地運行。Car艙等和乘客量之間的關係Passenger [] passengers不太嚴格。這就是所謂的聚合。關於這個主題有一篇很好的文章:類別(物件)之間的關係。它提供了聚合的另一個很好的例子。假設我們有一個班級Student代表一個學生,還有一個班級StudentsGroup(一組學生)。學生可以是物理俱樂部、星際大戰學生粉絲俱樂部或 KVN 團隊的成員。 組合是一種更嚴格的溝通類型。當使用組合時,一個物件不僅是某個物件的一部分,而且不能屬於同一類型的另一個物件。最簡單的例子是汽車引擎。引擎是汽車的一部分,但不能是另一輛車的一部分。正如您所看到的,它們的連接比Car和的連接要嚴格得多Passengers類之間的關係。 繼承、組合和聚合 - 4
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION