构造函数(constructor)是人们完成结构化程序设计的一个新概念。在OO设计语言中,构造函数就是与类名同名而且没有返回类型的方法。
例如,Cabbie类的构造函数大致是:
1 2 3 |
|
编译器会识别出这个方法名与类名相同,从而认为这个方法是一个构造函数。
构造函数没有返回值。如果为方法提供了一个返回值,编译器就不会把它作为一个构造函数。
何时调用构造函数
创建一个新对象时,首先要做到事情之一就是调用构造函数。
1
|
|
会实例化一个Cabbie对象,并调用Cabbie方法。
构造函数中有什么
构造函数中的代码应当将新创建的对象设置为其稳定、安全的初始状态。
初始化属性是构造函数完成的一个常见功能。
默认构造函数
至少存在一个构造函数,不论你自己是否编写了构造函数。如果你没有提供构造函数,系统也会为你提供一个默认的构造函数。例如,如果没有为Cabbie类提供一个构造函数,就会插入一下默认构造函数:
1 2 3 |
|
如果没有显式地继承另一个类,Object类就会成为父类。如果类中有属性,好的实践往往是初始化这些属性。
提供一个构造函数
一般经验是,总是应该提供一个构造函数,即使你不打算在其中做任何事情。可以先提供一个构造函数,其中不包含任何内容,等以后再补充,使用编译器提供的默认构造函数尽管从技术上讲没什么问题,但是最好能清楚地知道你的代码到底是怎样的。
重载构造函数
有时可能希望传入一个初始化参数,这成为重载一个方法。
重载适用于所有方法。重载允许程序员多次使用同一个方法名,只要每次方法的签名不同。签名由方法名和一个参数列表组成。
1 2 3 4 5 6 7 8 9 |
|
在JAVA和C#,返回类型不是签名的一部分。只是返回类型不同的方法会冲突。
超类如何构造
使用继承时,必须知道父类如何构造。要记住,使用继承时,会从父类继承一切。因此,必须非常清楚父类的所有数据和行为。不过,构造函数如何继承就不那么明显了。
遇到new关键字并且分配了对象后,会完成以下几个步骤。
构造函数中首先要做的是调用该类的超类的构造函数。如果没有显式地调用超类构造函数,就会自动调用超类默认构造函数;不过可以从字节码查看这个代码。
然后初始化对象的各个类属性。这些属性都是类定义的属性(实例变量),而不是构造函数或其他方法中的属性(局部变量)。
然后执行构造函数中的其余代码。
构造函数的设计
设计一个类时,好的时间是初始化所有属性。不要指望编译器来初始化属性。构造函数可以用来确保应用处于一种稳定的状态。例如,若将一个属性初始化为0,那么当想把它用作一个除法运算的除数时,可能会导致一个不稳定的应用。初始化为0并不总是最好的策略。