组合的两个作用:
1)通过将父类对象作为子类的属性
2)通过第1点的作用,实现了代码复用。
示例代码:
public class TestComponent {public static void main(String[] args) {Student2 s1= new Student2("jason",180,"Java");System.out.println(s1.person2.name);System.out.println(s1.person2.height);System.out.println(s1.major);}
}class Person2 {String name;int height;public void rest(){System.out.println("休息!");}
}class Student2 {Person2 person2 = new Person2();//Person2 是一个引用类型,类似于int这样的类型声明// person2 是一个对象、是一个变量、是一个属性,类似于int a 里的a//new Person2()作用,就是新建了一个Person2 这个(父)类的对象//因为Person2先于Student2,所以叫它为父类String major;//专业、public void study(){System.out.println("学习!");person2.rest();//通过person2这个对象,来使用Person2类中的方法rest()}public Student2(String name, int height, String major) { //定义一个学生的对象构造器this.person2.name = name;//通过person2这个对象,来使用Person2类中的属性namethis.person2.height = height;//通过person2这个对象,来使用Person2类中的属性heightthis.major = major;}
}
运行结果:、
组合比较灵活。继承只能有一个父类,但是组合可以有多个属性。所以,有人声称“组合优于继承,开发中可以不用继承”,但是,不建议大家走极端。
对于“is -a”关系建议使用继承,“has-a”关系建议使用组合。所以这里有一个在建模时的逻辑关系的问题。
比如:上面的例子,Student is a Person这个逻辑没问题,但是:Student has a Person就有问题了。这时候,显然继承关系比较合适。
再比如:笔记本和芯片的关系显然是“has-a”关系,使用组合更好。