在现场实例化和在构造函数中实例化有什么区别?

2022-09-04 20:46:01

这样做有什么区别:

public class SomeClass {
    SomeObject obj = new SomeObject();
    //rest of the code
}

和这个

public class SomeClass {
    SomeObject obj;
    public SomeClass(){
       obj = new SomeObject();
    }
    //rest of the code
}

答案 1

根据 Java 语言规范的第 12.5 章创建新类实例

在将对新创建对象的引用作为结果返回之前,将使用以下过程处理指示的构造函数以初始化新对象:

  1. 将构造函数的参数分配给为此构造函数调用新创建的参数变量。
  2. 如果此构造函数以显式构造函数调用同一类中的另一个构造函数(使用此构造函数)开始,则使用相同的五个步骤以递归方式计算参数并处理该构造函数调用。如果该构造函数调用突然完成,则此过程出于同样的原因突然完成;否则,请继续执行步骤 5。
  3. 此构造函数不以显式构造函数调用同一类中的另一个构造函数(使用此构造函数)开始。如果此构造函数用于 Object 以外的类,则此构造函数将从超类构造函数的显式或隐式调用(使用 super)开始。使用相同的五个步骤以递归方式评估超类构造函数调用的参数和过程。如果该构造函数调用突然完成,则此过程会出于同样的原因突然完成。否则,请继续执行步骤
  4. 执行此类的实例初始值设定项和实例变量初始值设定项,将实例变量初始值设定项的值按从左到右的顺序分配给相应的实例变量,这些变量在类的源代码中以文本方式显示。如果执行这些初始值设定项中的任何一个导致异常,则不会处理进一步的初始值设定项,并且此过程会突然完成,并出现相同的异常。否则,请继续执行步骤 5。(在某些早期实现中,如果字段初始值设定项表达式是一个常量表达式,其值等于其类型的默认初始化值,则编译器会错误地省略用于初始化字段的代码。
  5. 执行此构造函数主体的其余部分。如果该执行突然完成,则此过程会出于同样的原因突然完成。否则,此过程将正常完成。

因此,差异只是步骤(步骤4或步骤5),但结果是相同的。


答案 2

唯一的区别在于在哪个步骤初始化引用。最终效果是相同的。


推荐