我已经习惯了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>()
?第三:这是最佳做法吗?
答案 0 :(得分:6)
第一:它做了什么?
在执行构造函数中的代码之前,执行所有字段初始值设定项(按顺序)。 (在这种情况下,您尚未声明构造函数,因此有一个默认的no-args构造函数,它调用超类no-args构造函数。)
第二:什么时候新的ArrayList()被调用?
在实例化新对象期间调用它。
调用在超类构造函数完成之后,在执行此类构造函数中的语句之前发生。 (在这种情况下,构造函数中没有语句。)
第三:这是最佳做法吗?
很好。
答案 1 :(得分:2)
它相当于在构造函数的开头保留这些变量。此外,如果您正在使用实例初始化块,则在调用初始化块之前初始化它们。执行超类构造函数后,顺序为:在类体,初始化块,构造函数体中初始化的字段。如果只声明类体中的字段,编译器会自动将它们初始化为默认值:对象为null,布尔值为false等。