【问题标题】:Declaring Member Class Variables and Instantiating Them [duplicate]声明成员类变量并实例化它们[重复]
【发布时间】:2013-04-21 05:31:37
【问题描述】:

我习惯了 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&lt;Debate&gt;()?第三:这是最佳实践吗?

【问题讨论】:

标签: java


【解决方案1】:

首先:它有什么作用?

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

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

在新对象的实例化过程中调用它。

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

第三:这是最佳实践吗?

没关系。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-18
      • 2017-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-27
      • 1970-01-01
      • 2012-11-28
      相关资源
      最近更新 更多