华为ICT培训-高端面授华为ICT培训机构
云和教育:云和数据集团高端IT职业教育品牌
  • 华为
    授权培训中心
  • 腾讯云
    一级认证培训中心
  • 百度营销大学
    豫陕深授权运营中心
  • Oracle甲骨文
    OAEP中心
  • Microsoft Azure
    微软云合作伙伴
  • Unity公司
    战略合作伙伴
  • 普华基础软件
    战略合作伙伴
  • 新开普(股票代码300248)
    旗下丹诚开普投资
  • 中国互联网百强企业锐之旗
    旗下锐旗资本投资

Java中继承与聚合的区别是什么?

  • 发布时间:
    2023-05-25
  • 版权所有:
    云和教育
  • 分享:

在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方法。