在Java中,继承(inheritance)和聚合(aggregation)是两种不同的对象关系。它们在代码实现和语义上有所不同。
继承是一种对象之间的关系,其中一个类(子类)继承另一个类(父类)的属性和方法。子类可以重用父类的代码,并可以添加新的属性和方法。继承是一种”is-a”(是一个)关系,其中子类是父类的一种特殊类型。在Java中,使用关键字extends来实现继承。
聚合是一种对象关系,其中一个类(整体)包含另一个类(部分)作为其成员变量。部分对象可以独立存在,并且可以与多个整体对象相关联。聚合是一种”has-a”(有一个)关系,其中整体对象包含部分对象。在Java中,可以通过将部分对象声明为整体对象的成员变量来实现聚合关系。
下面是一个简单的代码示例,演示了继承和聚合的区别:
// 父类
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");
}
}
// 整体类包含部分对象
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(); // 调用继承自父类的方法
car.drive(); // 调用子类的方法
System.out.println();
// 聚合示例
Engine engine = new Engine();
Car2 car2 = new Car2("Toyota", engine);
car2.start(); // 调用整体对象的方法,并使用部分对象的方法
}
}
在上述示例中,Car类通过继承Vehicle类获得了start方法,并添加了自己的drive方法。而Car2类使用聚合关系,将Engine对象作为成员变量,通过调用整体对象的start方法,间接调用了部分对象的start方法。