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"建议组合.