1

这两种初始化类成员的方式有什么区别吗?

在类体内:

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

或者在构造函数中:

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

5 回答 5

4

理论上,初始化的顺序是有区别的。这是 JVM 使用的序列:

  1. 执行静态语句/静态块。
  2. 实例变量被赋予默认值
  3. 如果为实例变量分配了编译时间常数,则初始化实例变量。否则,它将与第 5 项一起完成(实例变量实例初始化器将按照定义的顺序从上到下一起完成)。
  4. 构造函数运行
  5. 实例初始化块在对 super 的所有调用都已完成但在构造函数的其余部分执行之前运行。
  6. 其余的构造函数被执行。

此外,如果您在构造函数中初始化字段,则可能意味着您可能会得到一些重复。就个人而言,我认为在构造函数或字段中实例化它们并不重要,但重点是您对此保持一致。对我来说,让它们在字段声明中实例化很有帮助,这样我就知道哪些字段始终存在,哪些字段是可选的。希望有帮助!

于 2013-09-03T11:17:22.853 回答
3

实例初始化程序首先运行,然后初始化构造函数中的值。您可以研究初始化块和构造函数的执行顺序

于 2013-09-03T11:14:58.820 回答
2

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

private mB = new B();

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

于 2013-09-03T11:15:40.777 回答
1

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

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

于 2013-09-03T11:14:22.550 回答
1

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

于 2013-09-03T11:17:34.173 回答