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

标签 java

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

相关文章:

java - 包装类RAM

java - 在 ListView 中在 TextView 旁边显示 ImageView

java - 当 PhantomJS 嵌入到 jar 文件中时如何使用 phantomjs.binary.path?

java - Spring 的多重依赖

java - 如何进行循环截击

java - Spring Boot 中的 Tika 解析器配置

java - Mac 上的 MVN 权限被拒绝

weblogic 中的 java.io.EOFException

java - LibGDX 0.9.9 - 在环境中应用立方体贴图

java - Thread.sleep和隐藏按钮