本章:描述了复用三种方法:组合、继承和代理
一、组合
组合只需要将对象引用置于新类即可。初始化引用的四种途径:
public class Bath {
private String s1 = "Happy",s2, s3, s4;// Way 1:Initializing at point of definition:
public Bath() {
s2 = "New"; // Way 2: Initializing in the constructor
}
{ s3= "Year"; } // Way 3: Instance initialization:
public String toString() {
if(s4 == null) // Way 4: Delayed initialization:
s4 = "Everybody";
return
"s1 = " + s1 + "\n" +
"s2 = " + s2 + "\n" +
"s3 = " + s3 + "\n" +
"s4 = " + s4 + "\n" +
}
}
如上述程序所示,可以在程序的四个位置初始化对象引用:
- 在定义对象的地方,则其可以在构造器调用之前被初始化
- 在构造器中初始化
- 实例初始化
- 惰性初始化,在实际使用时才初始化
二、继承
继承即按照现有的类的类型来创造新类,无需改变现有类,在现有类的基础上添加新的代码。
用extends 关键字来表示。
Java中若没有显示的继承,则都是隐式的继承Object类。
继承的一般规则为所有数据为private ,所有方法为public。
调用基类则用super关键字
- 基类在导出类构造器访问其本身之前,就已经完成了初始化,构建过程从基类向外扩散。
- 若每个类都有不带参数的默认构造器,则不需要super 即可调用基类构造器语句。
- 构造了导出类的首件事情即需要调用基类的构造器。
三、代理
Java没有直接为其提供支持,但可以用组合实现代理的效果。代理一般用于当两个类不符合继承的关系,但是又想在一个类中取得对另一个类方法的直接使用权(一般只有子类可以)。
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() {}
} ///:~
public class SpaceShipDelegation {
private String name;
private SpaceShipControls controls =
new SpaceShipControls();
public SpaceShipDelegation(String name) {
this.name = name;
}
// Delegated methods:
public void back(int velocity) {
controls.back(velocity);
}
public void down(int velocity) {
controls.down(velocity);
}
public void forward(int velocity) {
controls.forward(velocity);
}
public void left(int velocity) {
controls.left(velocity);
}
public void right(int velocity) {
controls.right(velocity);
}
public void turboBoost() {
controls.turboBoost();
}
public void up(int velocity) {
controls.up(velocity);
}
public static void main(String[] args) {
SpaceShipDelegation protector =
new SpaceShipDelegation("NSEA Protector");
protector.forward(100);
}
} ///:~
try … finally 关键字
把需要特殊处理的部分带入try下方,而无论try块怎么退出,finally 子句中的代码总是要被执行的。
在清理方法中,对基类和子类清理方法的顺序,要先清理子类,最后是基类。