Java组合

组合Composition和组合和继承的关系:
另一种 实现“代码复用”——组合。
相较于继承,组合更加灵活。继承一个子类只有一个直接父类,而组合就可以解决这个问题。
组合是区别于继承的另一种代码复用机制。
本质是类A将类B的对象作为自己的属性形成新的组合,通过该属性使用类B的属性和方法。
场景:
在对真实世界建模方面,适合于“has-a”关系,如车子有引擎、电脑包含CPU、存储器、显示器等关系。
实现:
1.基本组合 实现
在类信息代码里,声明持有组件对象
在类的构造器里,创建组件(创建被组合类的对象),如

// Java300集 例子
// 可用组合重写继承,注意组合并不要求类之间存在继承关系
public class Demo3_inherit_2_composition {
    public static void main(String[] args) {
        Student s = new Student("高小七",172,"Java");
        s.study();// 调用成员方法


    }
}
class Person {
    private String name;
    private int height;

    public Person(String name, int height) {
        this.name = name;
        this.height = height;
    }

    public void rest() {
        System.out.println("光学习不玩耍,聪敏的杰克也变傻!");
    }
}
class Student{
    private String major;
    private Person p;// Person类将作为一个属性,其属性,方法都可以依此调用

    public Student(String name,int height,String major) {
        this.p = new Person(name,height);
        this.major = major;

    }
    public void study() {
        System.out.println("好好学习,天天向上!");
        p.rest();
    }
}

Java组合可以算作一种多继承方法,但相较于C++的多继承,其耦合度要更低
而且,组合允许通过定义方法来更换组件(另一优势?),如

// 组合
// 电脑:内存,CPU
// 良好的封装:创建对象的过程 放在了组合类的构造器里;即在组合类的构造器里 通过 调用旧类的构造器 来初始化组合类
class Memories {
    private String size;

    public Memories(String size) {
        this.size = size;
    }

    public void store(){
        System.out.println(size+"存储器正在存储数据——");
    }
}
class CPU {
    private String speed;

    public CPU(String speed) {
        this.speed = speed;
    }

    public void run(){
        System.out.println(speed+"CPU正在平稳运行!");
    }
}
class Computer {
    // 持有对象组件
    private CPU cpu;
    private Memories m;

    public Computer(String size, String speed) {
        // 创建对象组件
        this.cpu = new CPU(speed);
        this.m = new Memories(size);
    }
    public void start() {
        System.out.println("开机中。。。");
        cpu.run();// Person类将作为一个属性,其属性√,方法√都可以依此调用
        m.store();
        System.out.println("开机成功!");
    }
    // 在方法里更换组件?道理很简单。对于对象c来说,经历初始化(第一次构造器赋值),对象m和cpu被创建,
    // 之后调用方法更新c的属性(这里是创建新m对象)
    public void change(String size) {
        this.m = new Memories(size);
        System.out.println("...内存条更换成功!");
    }
}
public class Demo3_inherit_3 {
    public static void main(String[] args) {
        Computer pc = new Computer("512GB","咻——!");
        pc.start();

        pc.change("1TB");
        pc.start();
    }

}

对现实进行建模。"is-a"建议继承,"has-a"建议组合。
我们知道String并非基本数据类型,而是类。那么String的使用是不是就是利用组合机制呢?

posted on 2026-01-16 23:32  VoidHan21  阅读(1)  评论(0)    收藏  举报