声明成员类变量并实例化它们

sin*_*inθ 0 java

我已经习惯了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);
    }
}
Run Code Online (Sandbox Code Playgroud)

但这留下了很多问题.第一:它做了什么?第二:何时被new ArrayList<Debate>()召唤?第三:这是最佳做法吗?

Ste*_*n C 6

第一:它做了什么?

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

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

在实例化新对象期间调用它.

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

第三:这是最佳做法吗?

没事.