在Java中,繼承(inheritance)和聚合(aggregation)是兩種不同的對(duì)象關(guān)系。它們?cè)诖a實(shí)現(xiàn)和語(yǔ)義上有所不同。
繼承是一種對(duì)象之間的關(guān)系,其中一個(gè)類(子類)繼承另一個(gè)類(父類)的屬性和方法。子類可以重用父類的代碼,并可以添加新的屬性和方法。繼承是一種”is-a”(是一個(gè))關(guān)系,其中子類是父類的一種特殊類型。在Java中,使用關(guān)鍵字extends來(lái)實(shí)現(xiàn)繼承。
聚合是一種對(duì)象關(guān)系,其中一個(gè)類(整體)包含另一個(gè)類(部分)作為其成員變量。部分對(duì)象可以獨(dú)立存在,并且可以與多個(gè)整體對(duì)象相關(guān)聯(lián)。聚合是一種”has-a”(有一個(gè))關(guān)系,其中整體對(duì)象包含部分對(duì)象。在Java中,可以通過(guò)將部分對(duì)象聲明為整體對(duì)象的成員變量來(lái)實(shí)現(xiàn)聚合關(guān)系。
?
下面是一個(gè)簡(jiǎn)單的代碼示例,演示了繼承和聚合的區(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類通過(guò)繼承Vehicle類獲得了start方法,并添加了自己的drive方法。而Car2類使用聚合關(guān)系,將Engine對(duì)象作為成員變量,通過(guò)調(diào)用整體對(duì)象的start方法,間接調(diào)用了部分對(duì)象的start方法。
Copyright ? 2013-2021 河南云和數(shù)據(jù)信息技術(shù)有限公司 豫ICP備14003305號(hào) ISP經(jīng)營(yíng)許可證:豫B-20160281