我想知道这两种实例化实例变量的方式有什么区别。无论哪种情况,它都会在创建 PersonDirectory
的实例时创建 persons
的实例。
public class PersonDirectory {
private ArrayList<Person> persons = new ArrayList<>();
}
public class PersonDirectory {
private ArrayList<Person> persons;
public PersonDirectory(){
persons = new ArrayList<Person>();
}
}
最佳答案
它们是如此相似,以至于对于基本编程来说,它们可以被认为是等价的。您可能会注意到的最明显的事情是当您将另一个构造函数添加到 PersonDirectory
时,如下所示:
public class PersonDirectory {
private ArrayList<Person> persons;
private DirectoryAdmin admin;
public PersonDirectory() {
persons = new ArrayList<Person>();
}
public PersonDirectory(DirectoryAdmin initialAdmin) {
admin = initialAdmin;
}
}
如果您使用第二个构造函数,您会发现在构造 PersonDirectory 之后 persons
为 null。这是因为 Java 不会自动为您运行其他构造函数。您可以通过添加对 this()
的显式调用来解决该问题,该调用还运行与 this
调用的签名相匹配的构造函数。
public class PersonDirectory {
private ArrayList<Person> persons;
private DirectoryAdmin admin;
public PersonDirectory() {
persons = new ArrayList<Person>();
}
public PersonDirectory(DirectoryAdmin initialAdmin) {
this();
admin = initialAdmin;
}
}
但很多时候程序员忘记添加对 this() 的调用;并且可能会发现 persons 已被留空,因为他们的一个构造函数是粗心编写的,为时已晚。
如果您改为在声明中内嵌初始化,则无论您调用哪个 PersonDirectory 构造函数,初始化都会运行,因此可以认为不太容易出错。
public class PersonDirectory {
private ArrayList<Person> persons = new ArrayList<Person>();
private DirectoryAdmin admin;
public PersonDirectory() {
}
public PersonDirectory(DirectoryAdmin initialAdmin) {
// don't have to worry about forgetting to call this();
admin = initialAdmin;
}
}
然而,有时更喜欢在构造函数中进行初始化是有原因的。例如,它可以为子类及其构造函数提供更多控制。
最好尽可能将成员变量声明为 final
。这样,如果您编写了一个未初始化某些字段的构造函数,编译器会提醒您。
内联初始化语句总是在类的构造函数之前运行。
关于java - 实例变量声明和实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18927607/