从图中可以看出,构造器B完全包含了构造器A。对于这种完 全包含的情况,如果是两个方法之间存在这种关系,则可在方法B中调 用方法A。但构造器不能直接被调用,构造器必须使用new关键字来调 用。但一旦使用new关键字来调用构造器,将会导致系统重新创建一个 对象。为了在构造器B中调用构造器A中的初始化代码,又不会重新创 建一个Java对象,可以使用this关键字来调用相应的构造器。下面代 码实现了在一个构造器中直接使用另一个构造器的初始化代码。 上面的Apple类里包含了三个构造器,其中第三个构造器通过this来调用另一个重载构造器的初始化代码。程序中this(name, color);调用表明调用该类另一个带两个字符串参数的构造器。 使用this调用另一个重载的构造器只能在构造器中使用,而且必 须作为构造器执行体的第一条语句。使用this调用重载的构造器时, 系统会根据this后括号里的实参来调用形参列表与之对应的构造器。
为什么要用this来调用另一个重载的构造器?我把另一个 构造器里的代码复制、粘贴到这个构造器里不就可以了吗? 答:如果仅仅从软件功能实现上来看,这样复制、粘贴确实可以实现这个效果;但从软件工程的角度来看,这样做是相当糟糕的。在软件 开发里有一个规则:不要把相同的代码段书写两次以上!因为软件是 一个需要不断更新的产品,如果有一天需要更新图5.16中构造器A的 初始化代码,假设构造器B、构造器C……里都包含了相同的初始化代 码,则需要同时打开构造器A、构造器B、构造器C……的代码进行修 改;反之,如果构造器B、构造器C……是通过this调用了构造器A的 初始化代码,则只需要打开构造器A进行修改即可。因此,尽量避免 相同的代码重复出现,充分复用每一段代码,既可以让程序代码更加 简洁,也可以降低软件的维护成本。



