前言:本节主要介绍《Java编程思想》第七章

一、组合语法:将对象引用置于新类中即可
1.在新类中使用旧的类引用,就是组合。需要注意的是,在新类中对基本数据类型的定义,编译器会使它的默认值为0。而如果是对象的定义,默认值为null。如果你对其进行引用,则会抛出异常。
2.编译器并不是简单地为每一个引用创建一个默认对象。如果你想要对这些对象初始化,可以在以下几个地方进行。
a.在定义对象的地方。这意味着它们总是能够在构造器被调用之前被初始化。
b.在类的构造器中。
c.就在正要使用这些对象之前,这种方式为惰性初始化。在生成对象不值得及不必每次都生成对象的情况下,这种方式可以减少额外负担。
4.使用实例初始化。
二、继承语法
1.除非已明确指出要从其它类中继承,否则就是在隐式地从Java的标准类Object进行继承。
2.初始化基类:导出类构造器在构造之时就基类就已经完成了初始化。在构造器中调用基类构造器来执行初始化,而基类构造器具有执行基类初始化所需要的所有知识和能力。Java会自动在导出类的构造器中插入对基类构造器的调用。
3.带参数的构造器:想调用带参数的基类构造器可以使用super关键字。
三、代理:继承与组合的中庸之道,将一个成员对象置于所要构造的类中(就像组合),但与此同时我们在新类中暴露了该成员对象的所有方法(就像继承)。举例说明(书上的例子)

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 turnBoost(){}
}

//不提倡这种方式构造太空船
//这里只使用一种方法forward(),但是却暴露了SpaceShipControls类的所有方法
public class SpaceShip extends SpaceShipControls{	
	private String name;
	public SpaceShip(String name){this.name=name;}
	public static void main(String...args){
		SpaceShip protector=new SpaceShip("NSEA Protector");
		protector.forward(100);
	}
}

//推荐使用这种方式,即采用代理(委托)
public class SpaceShipDelegation{	
	private String name;
	private SpaceShipControls controls=new SpaceshipControls();
	public SpaceDelegatoin(String name){this.name=name;}
	public void forward(int velocity){
		controls.fortard(velocity);
	}

	public static void main(String...args){
		SpaceShipDelegation protector
		=new SpaceShipDelegation("NSEA Protector");
		protector.forward(100);
	}
}

可以看到代理相对于继承的好处。可以按需对我们的操作进行选择,而不是一股脑的向客户端程序员暴露基类的所有方法。

四、在组合与继承之间选择
1.组合通常用于想在新类中实现现有类的功能而非它的接口这种情形。即,在新类中嵌入某个对象,让其实现所需要的功能,但新类的用户看到的只是为新类所定义的接口,而非嵌入对象的接口。
2.在继承的时候,使用了某个现有类,并开发一个它的特殊版本。

五、final关键字
1.final数据:向编译器告知:a.一个永不改变的编译常量;b.一个在运行时被初始化的值,而你不希望它被改变。对于一个既是static又是final的域只占据一段不能改变的储存空间。如果一个对象是final的,一旦这个引用被初始化,那么这个引用始终指向这个对象。无法将这个引用指向另外一个对象。
2.空白final:Java允许生成“空白final,但是必须在使用前初始化它。空白final提供了更高的灵活性。
3.final参数:一个方法的参数是final的,那么意味着你不能在方法中参数引用所指的对象。
4.final方法:一个方法是final的,意味着其导出类不能覆写这个方法。
5.类中所有的private方法都是final的(因为其导出类无法取用它)。
5.final类,一个类是final的,那么说明这个类将无法作为继承的基类。