gpt4 book ai didi

java - 实例变量声明和实例化

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:16:46 25 4
gpt4 key购买 nike

我想知道这两种实例化实例变量的方式有什么区别。无论哪种情况,它都会在创建 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com