组合 继承 代理
组合语法:
只需要将对象引用置于新类中即可。例如,你需要某个对象,而且它还要有多个String对象,几个基本数据,以及另一个类的对象。
类中域为基本类型时能够被自动初始化为0,但是对象引用会被初始化为null,编译器并不是简单地为每一个引用都创建默认对象,这一点非常有意义,如果那样的话会增加许多不必要的负担。
想初始化这些引用,可以在代码中的下列位置进行:
- 定义对象的地方。这意味着它们能够在构造器被调用之前被初始化
- 在类的构造器中
- 就在正要使用这些对象之前,称为惰性初始化(Delayed Initialization)。在生成对象不值得及不必每次都生成对象的情况下,这种方式可以减少额外的负担。
- 使用实例初始化
继承语法:
继承是所有OOP语言和Java语言不可或缺的一部分。当创建一个类的时候总是在继承,因此,除非已明确指出从哪里继承,否则就是隐式的从Object继承
组合的语法比较平实,但是继承使用的是一种特殊的语法:书写extends实现。这么做会自动得到基类中的所有域和方法。
使用基类中定义的方法以及对他进行修改是可行的,调用基类方法用super关键字。继承过程中不一定非得使用基类的方法,也可以在导出类中添加新方法。
代理:
第三种关系称为代理,Java语言并没有提供对他的直接支持。这是继承与组合之间的中庸之道。因为我们将一个成员对象置于所要构造的类中(就像组合),但与此同时我们在新类中暴露了该成员对象的所有方法(就像继承)。我们使用代理时可以拥有更多的控制力,因为我们可以选择只提供在成员对象中的方法的某个子集。
太空船控制模块:
package reusing;
public class SpaceShipControls {
void up(int velocity) {}
void down(int velocity) {}
void left(int velocity) {}
void right(int velocity) {}
void forward(int velocity) {}
void back(int velocity) {}
void turboBoost(int velocity) {}
}
package reusing;
public class SpaceShipDelegation {
private String name;
private SpaceShipControls controls = new SpaceShipControls();
public SpaceShipDelegation(String name) {
this.name = name;
}
//Delegated Methods
public void up(int velocity) {
controls.up(velocity);
}
public void down(int velocity) {
controls.down(velocity);
}
public void left(int velocity) {
controls.left(velocity);
}
public void right(int velocity) {
controls.right(velocity);
}
public void forward(int velocity) {
controls.forward(velocity);
}
public void back(int velocity) {
controls.back(velocity);
}
public void turboBoost(int velocity) {
controls.turboBoost(velocity);
}
@Override
public String toString() {
return name;
}
public static void main(String[] args) {
SpaceShipDelegation shadow = new SpaceShipDelegation("Shadow");
shadow.up(100);
System.out.println(shadow);
}
}