0

我习惯了 C++,你必须在构造函数中实例化所有内容,但最近的一个认识让我对 java 感到非常困惑。我只是在构造函数中实例化一些东西,然后我意识到这个语法是有效的:

public class DebateCompetition {
    private boolean isAdvanced;
    ArrayList<Debate> debates = new ArrayList<Debate>(); //<------
    ArrayList<Team> teams;
    ArrayList<School> schools;

    public void addSchool(School s) {
        schools.add(s);
    }
}

但这留下了很多问题。第一:它有什么作用?第二:什么时候new ArrayList<Debate>()调用?第三:这是最佳实践吗?

4

2 回答 2

6

第一:它有什么作用?

在执行构造函数中的代码之前(按顺序)执行所有字段初始值设定项。(在这种情况下,您还没有声明构造函数,因此有一个默认的无参数构造函数,它调用超类的无参数构造函数。)

第二:什么时候调用 new ArrayList()?

它在新对象的实例化期间被调用。

调用发生在超类构造函数完成之后,并且在执行此类构造函数中的语句之前。(在这种情况下,构造函数中没有语句。)

第三:这是最佳实践吗?

没事。

于 2013-04-26T23:36:08.040 回答
2

这相当于在构造函数的开头初始化这些变量。此外,如果您正在使用实例初始化块,它们会在初始化块被调用之前被初始化。执行超类构造函数后的顺序是:类体中初始化的字段、初始化块、构造函数体。如果只在类主体中声明字段,编译器会自动将它们初始化为默认值:对象为 null,布尔值为 false 等。

于 2013-04-26T23:35:43.760 回答