面向对象的思考过程(原书第5版)
上QQ阅读APP看书,第一时间看更新

3.1.3 默认构造函数

如果你编写了一个不包含构造函数的类,这个类仍然可以通过编译,你也可以使用它。如果没有为类提供一个显式的构造函数,那么类会有一个默认的构造函数。请记住无论你是否自定义了构造函数,类始终至少有一个构造函数。如果你没有提供构造函数,系统会为你提供一个默认的构造函数。

除了创建对象本身,默认构造函数的另一个行为是调用父类的构造函数。大多数情况下父类是语言框架的一部分,比如Java中的Object类。例如,如果没有为Cabbie类提供构造函数,系统会提供下面默认的构造函数:

如果要反编译编译器生成的字节码,你会看到这段代码。这段代码实际上是由编译器插入的。

在本例中,如果Cabbie没有显式继承自其他类,Object类将会是它的父类。默认的构造函数在有些场景下是适用的。然而在大多数场景下,需要自定义初始化一系列内存。不管在什么情况下,在类中始终包含至少一个构造函数是一个优秀的编程实践。如果类有属性,最好始终在构造函数中初始化这些属性。延伸开来,无论是否在编写面向对象的代码,初始化变量总是一个优秀的实践。

提供构造函数

通用规则是,即使并不需要在构造函数中做任何事情,也应当始终提供一个构造函数。你可以提供一个不包含任何代码的构造函数,稍后再按需添加代码。尽管使用编译器默认提供的构造函数在技术上没有任何问题,但基于文档化和维护目的,这样代码的可读性会高一些。

这里考虑维护问题并不奇怪。如果你使用的是默认的构造函数,后续操作添加了另一个构造函数,那么系统不会再创建默认的构造函数。事实上,这就会让某些期望默认构造函数的代码出错。

请总是牢记,只有类中没有包含任何构造函数时,系统才会添加默认的构造函数。一旦提供了一个构造函数,系统就不再提供默认的构造函数。