一、组合
在一个类中有另一个类的对象。“has-a”
示例:
class Water{
private String s;
Water(){
System.out.println("Water()");
s = "Constructed";
}
public String toString(){ return s;}
}
public class SprinklerSystem{
private String value;
private Water w = new Water();//这就是组合
private int i;
public String toString(){
return "value = "+ value +" i = "+ i +” w = "+ w;
}
public static void main(String[] args){
SprinklerSystem sprintlers = new SprinklerSystem();
System.out.println(sprinklers);
}
}
输出:
Water()
value = null i = 0 w = Constructed
private Water w = new Water();这就是组合,在一个类中创建另一个类的对象。并且这个对象w和SprinklerSystem类的对象的生命周期相同。
每一个非基本类型的对象都有一个toString()方法,当编译器需要一个String而只有一个对象时如:System.out.println(sprinklers);便会调用toString()方法。
二、继承
继承:is-a,讲一个类的属性和方法保留,加上自己特有的方法和属性形成新类。
示例:
class Person{
public void eat(){
System.out.println("Person在吃东西");
}
private void sing(){
System.out.println("Person在唱歌");
}
}
class Man extends Person{
public void dance(){
System.out.println("Man在跳舞");
}
}
public class Test{
public static void main(String[] args){
Person p = new Person();
Man m = new Man();
p.eat();
p.sing();
//p.dance();父类不可以调用子类的方法。
m.eat();
//m.sing() sing方法为private,子类不可以调用父类private修饰的方法和变量。
m.dance();
}
}
输出
:
Person在吃东西
Person在唱歌
Person在吃东西
Man在跳舞
当创建一个类的时候,总是在继承。除非已明确向上述代码中指出从其他类中继承,否则就是隐式地从java根类Object。所有的类都是Object的子类(直接子类或间接子类)。继承在继承过程中,并不一定非得要调用基类的方法。也可以在导出类中添加新的方法。子类与父类初始化顺序可以查看这里。
三、组合与继承之间选择
组合和继承都允许在新的类中放置其他类对象,组合是显示地这样做,而继承是隐式的做。
组合技术通常用于在新类中使用现有类的功能而非它的接口这种情形。即,在新类中嵌入某个对象,让其实现所需要的功能,但新类的用户看到的只是为新类定义的接口,而非所嵌入对象的接口。
在继承的时候,使用某个现有类,并开发一个它的特殊版本。通常,这意味你在使用一个通用类,并为了某种需要而将其特殊化。车子 就是 交通工具的一个特殊化,is-a的关系是用继承表达的,而has-a的关系是用组合来表达的。