在类体或构造函数中初始化类成员?

时间:2013-09-03 11:10:43

标签: java constructor initialization

这两种初始化班级成员的方式有什么不同吗?

在课堂上:

public class A {
    private mB = new B();
    public A() {
    }
}

或者在构造函数中:

public class A {
    private mB = null;
    public A() {
        mB = new B();
    }
}

5 个答案:

答案 0 :(得分:4)

理论上,初始化顺序有所不同。这是JVM使用的序列:

  1. 执行静态语句/静态块。
  2. 为实例变量分配默认值
  3. 如果为实例变量分配了编译时常量,则初始化实例变量。否则,将使用第5项完成(实例变量实例初始化程序将从顶部到底部按照它们的定义顺序一起完成。)
  4. 构造函数运行
  5. 在超级的所有调用已经完成但在执行其余构造函数之前运行的实例初始化块运行。
  6. 执行其余的构造函数。
  7. 此外,如果初始化构造函数中的字段,则可能意味着您可能会遇到一些重复。就个人而言,我认为在构造函数或字段中实例化它们并不重要,但重点是你对它的一致性。对我来说,它有助于在字段声明中实例化它们,因此我知道哪些字段始终存在,哪些字段是可选的。希望有所帮助!

答案 1 :(得分:3)

首先运行实例初始化程序,然后初始化构造函数中的值。您可以学习order of execution of initialization blocks and constructors

答案 2 :(得分:2)

如果B()构造函数抛出了一个已检查的异常,那么这个

private mB = new B();

将是编译时错误,而在构造函数中,您可以捕获它或在throws子句中声明

答案 3 :(得分:1)

我会做你认为更简单的那个。

主要区别在于,如果向第一个添加另一个构造函数,则不必重复初始化。

答案 4 :(得分:1)

您的第一个示例初始化变量一次:第二个示例,两次。首先是首选,特别是如果有多个构造函数,除非当然涉及例外。