CodeGym /Java Blog /Toto sisi /類之間的關係。繼承、組合和聚合
John Squirrels
等級 41
San Francisco

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

在 Toto sisi 群組發布
你好!今天我們將仔細研究面向對象編程 (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. 那麼所有汽車的共同點是什麼,無論其類型如何?每輛車都有製造年份、型號名稱和最高速度。我們將這些屬性放入modelmaxSpeedyearOfManufacture字段中。至於行為,任何汽車都可以加速和減速。:) 我們在gas()brake()方法。這給我們帶來了什麼好處?首先,它減少了代碼量。當然,我們可以不用父類。但由於每輛汽車都必須能夠加速和減速,我們必須在、、和類以及所有其他汽車類中創建gas()和方法。想像一下我們需要編寫多少額外的代碼。並且不要忘記、和字段:如果我們去掉父類,我們將不得不在每個汽車類中創建它們! brake()TruckSedanF1CarSportsCarmodelmaxSpeedyearOfManufacture類之間的關係。 繼承、組合和聚合 - 2當我們有幾十個汽車類時,重複代碼的數量就會變得非常嚴重。將公共字段和方法(也稱為“狀態”和“行為”)移動到父類可以讓我們節省大量時間和空間。如果某些類型具有其他汽車類型所沒有的獨特屬性或方法,那沒什麼大不了的。您始終可以在後代類中創建它們,與其他人分開。

public class F1Car extends Car {

   public void pitStop() {

       // Only race 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-a”關係。獅子是一種動物。這樣的關係很容易用繼承來表達,其中Animal是父類,Lion是子類。然而,並不是所有的關係都是這樣描述的。例如,鍵盤肯定與計算機有關,但它不是計算機。手在某種程度上與人有關,但它們不是人。在這些情況下,我們有另一種類型的關係:不是“is-a”,而是“has-a”。一隻手不是一個人,而是一個人的一部分。鍵盤不是計算機,而是計算機的一部分。可以使用組合聚合在代碼中描述 has-a 關係. 區別在於關係的“嚴格”。讓我們舉一個簡單的例子:我們有一個Car類。每輛車都有發動機。此外,每輛車都有乘客。Engine engine和字段之間的根本區別是什麼Passenger[] passengers?乘客A坐在車裡並不意味著乘客B不在C車裡。一輛汽車可以對應多名乘客。更重要的是,如果所有乘客都下車,它仍然可以順利運行。Car類和數組之間的關係Passenger[] passengers不太嚴格。這叫做聚合。它提供了另一個聚合的好例子。假設我們有一個Student類和一個StudentGroup班級。一名學生可以加入多個學生組織:物理俱樂部、星球大戰粉絲俱樂部和/或學生喜劇俱樂部。 組合是一種更嚴格的關係。使用組合時,對像是某個對象的一部分,不能屬於同一類型的另一個對象。最簡單的例子是汽車發動機。發動機是汽車的一部分,不能是另一輛汽車的一部分。如您所見,他們的關係比Car和之間的關係要嚴格得多Passengers類之間的關係。 繼承、組合和聚合 - 4
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION