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

时间:2013-04-26 23:31:40

标签: 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);
    }
}

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

2 个答案:

答案 0 :(得分:6)

  

第一:它做了什么?

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

  

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

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

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

  

第三:这是最佳做法吗?

很好。

答案 1 :(得分:2)

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