更新時(shí)間:2023年05月24日09時(shí)51分 來源:傳智教育 瀏覽次數(shù):
在Java中,繼承(inheritance)和聚合(aggregation)是兩種不同的對(duì)象關(guān)系。它們在代碼實(shí)現(xiàn)和語義上有所不同。
繼承是一種對(duì)象之間的關(guān)系,其中一個(gè)類(子類)繼承另一個(gè)類(父類)的屬性和方法。子類可以重用父類的代碼,并可以添加新的屬性和方法。繼承是一種"is-a"(是一個(gè))關(guān)系,其中子類是父類的一種特殊類型。在Java中,使用關(guān)鍵字extends來實(shí)現(xiàn)繼承。
聚合是一種對(duì)象關(guān)系,其中一個(gè)類(整體)包含另一個(gè)類(部分)作為其成員變量。部分對(duì)象可以獨(dú)立存在,并且可以與多個(gè)整體對(duì)象相關(guān)聯(lián)。聚合是一種"has-a"(有一個(gè))關(guān)系,其中整體對(duì)象包含部分對(duì)象。在Java中,可以通過將部分對(duì)象聲明為整體對(duì)象的成員變量來實(shí)現(xiàn)聚合關(guān)系。
下面是一個(gè)簡單的代碼示例,演示了繼承和聚合的區(qū)別:
// 父類 class Vehicle { protected String brand; public Vehicle(String brand) { this.brand = brand; } public void start() { System.out.println("Starting the vehicle"); } } // 子類繼承父類 class Car extends Vehicle { private int numberOfSeats; public Car(String brand, int numberOfSeats) { super(brand); this.numberOfSeats = numberOfSeats; } public void drive() { System.out.println("Driving the car"); } } // 部分類 class Engine { public void start() { System.out.println("Starting the engine"); } } // 整體類包含部分對(duì)象 class Car2 { private String brand; private Engine engine; public Car2(String brand, Engine engine) { this.brand = brand; this.engine = engine; } public void start() { engine.start(); System.out.println("Starting the car"); } } public class Main { public static void main(String[] args) { // 繼承示例 Car car = new Car("Toyota", 4); car.start(); // 調(diào)用繼承自父類的方法 car.drive(); // 調(diào)用子類的方法 System.out.println(); // 聚合示例 Engine engine = new Engine(); Car2 car2 = new Car2("Toyota", engine); car2.start(); // 調(diào)用整體對(duì)象的方法,并使用部分對(duì)象的方法 } }
在上述示例中,Car類通過繼承Vehicle類獲得了start方法,并添加了自己的drive方法。而Car2類使用聚合關(guān)系,將Engine對(duì)象作為成員變量,通過調(diào)用整體對(duì)象的start方法,間接調(diào)用了部分對(duì)象的start方法。
北京校區(qū)