你好!今天我們將仔細研究面向對象編程 (OOP) 的一項原則:繼承。我們還將研究類之間其他類型的關係:組合和聚合。
這個主題並不難:在過去的課程中,您已經多次遇到過繼承和繼承示例。今天,主要是鞏固知識,更詳細地研究繼承機制,並再次運行一些示例。:) 好吧,我們走吧!
當我們有幾十個汽車類時,重複代碼的數量就會變得非常嚴重。將公共字段和方法(也稱為“狀態”和“行為”)移動到父類可以讓我們節省大量時間和空間。如果某些類型具有其他汽車類型所沒有的獨特屬性或方法,那沒什麼大不了的。您始終可以在後代類中創建它們,與其他人分開。
字段也是如此:如果一個子類有獨特的屬性,我們冷靜地在子類內部聲明這些字段,就不用擔心了。:)重用代碼的能力是繼承的主要優勢。 對於程序員來說,不寫多餘的代碼是很重要的。你會在工作中反复遇到這個問題。請記住其他重要事項:Java 沒有多重繼承. 每個類只繼承一個類。我們將在以後的課程中詳細討論其原因。現在,只要記住它。順便說一下,這使得 Java 不同於其他一些 OOP 語言。例如,C++ 支持多重繼承。一切都或多或少地通過繼承變得清晰。讓我們繼續。

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()
Truck
Sedan
F1Car
SportsCar
model
maxSpeed
yearOfManufacture

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
父類中的常見行為,子類的特定行為可以添加到這些類中。 
組成和聚合
類和對象可以鏈接在一起。繼承描述了一種“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
。 
更多閱讀: |
---|
GO TO FULL VERSION