我想知道这两种实例化实例变量的方法有什么区别。在任何一种情况下,当创建persons
的实例时,它将创建PersonDirectory
的实例。
public class PersonDirectory {
private ArrayList<Person> persons = new ArrayList<>();
}
public class PersonDirectory {
private ArrayList<Person> persons;
public PersonDirectory(){
persons = new ArrayList<Person>();
}
}
答案 0 :(得分:4)
它们非常相似,对于基本编程,它们可以被认为是等效的。您可能会注意到的最明显的事情是向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()的调用;并且可能发现太晚了,因为他们的一个建造者是不小心写的。
如果您改为使用声明内联编写初始化,则无论您调用哪个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
。这样编译器可以提醒您是否编写了一个未初始化某些字段的构造函数。
内联初始化语句总是在类的构造函数之前运行。
答案 1 :(得分:0)
两者都是平等的。一旦开始添加更多元素,就会出现轻微的边缘情况:
构造函数重载可能会使初始化不一致(第一个使用new X
,另一个使用new Y
,另一个根本不使用它)
该字段可能需要额外的计算 - &gt;构造函数更适合
不应在构造函数
答案 2 :(得分:0)
类加载和初始化序列
执行静态语句/静态块
为实例变量分配默认值[v] [1] alues
执行其余的构造函数。
http://www.coderanch.com/t/267125/java-programmer-SCJP/certification/Initializing-Sequence