它们是如此相似,以至于对于基本编程而言,它们可以被认为是等效的.您可能会注意到的最明显的事情是,当向PersonDirectory添加另一个构造函数时,如下所示:
public class PersonDirectory {
private ArrayList persons;
private DirectoryAdmin admin;
public PersonDirectory() {
persons = new ArrayList();
}
public PersonDirectory(DirectoryAdmin initialAdmin) {
admin = initialAdmin;
}
}
如果您使用第二个构造函数,则在构造PersonDirectory之后会发现person为null.这是因为Java不会自动为您运行其他构造函数.您可以通过向this()添加显式调用来解决问题,该显式调用还将运行与this调用的签名匹配的构造函数.
public class PersonDirectory {
private ArrayList persons;
private DirectoryAdmin admin;
public PersonDirectory() {
persons = new ArrayList();
}
public PersonDirectory(DirectoryAdmin initialAdmin) {
this();
admin = initialAdmin;
}
}
但是很多时候程序员忘记将调用添加到this();可能发现为时已晚,因为某人的构造函数写得很粗心,所以人们将其留空了.
如果您改为使用声明内联地编写初始化,则无论您调用哪个PersonDirectory构造函数,都将运行初始化,因此可以认为发生错误的可能性略小.
public class PersonDirectory {
private ArrayList persons = new ArrayList();
private DirectoryAdmin admin;
public PersonDirectory() {
}
public PersonDirectory(DirectoryAdmin initialAdmin) {
// don't have to worry about forgetting to call this();
admin = initialAdmin;
}
}
但是,出于某些原因,有时需要在构造函数中进行初始化.例如,它可以赋予子类及其构造函数更多的控制权.
最好在可能的情况下将成员变量声明为final.这样,编译器可以提醒您是否编写了使某些字段未初始化的构造函数.
内联初始化语句始终在类的构造函数之前运行.