合成最直接就是只要把对象的reference直接放到新的类里面就行了。假设,你要创建一个新的类,其中有几个String对象,几个primitive数据,以及一个别的什么类型的对象。对于非primitive的对象,你只要把它的reference放到类里面就行了。所有非primitive对象都有一个toSring()方法,当编译器需要一个String而它却是一个对象的时候,编译器就会自动调用这个方法。
当primitive数据作为类的成员的时候,会被自动地初始化为零。而对象的reference则会被初始化为null,如果这时,你去调用这个对象的方法,就会得到异常。能把它打印出来而不抛出异常,这真是太好了,而且也很实用。
编译器不为reference准备默认对象的这种做法,实际上也是很合乎逻辑的。因为在很多情况下,这么做会引发不必要的性能开销。如果你向对reference进行初始化,在定义对象的时候,这就意味着在构造函数调用之前,它们已经初始化完毕了。
注意,bath的构造函数会先打印一条消息再进行初始化。如果你不在定义对象的时候进行初始化,那么没人可以担保,在向这个对象的reference发送消息的时候,它已经被初始化了——反倒是会有异常来告诉你,它还没有初始化。