在字段中实例化和在构造函数中实例化之间有什么区别?

时间:2009-10-18 16:13:50

标签: java

这样做之间的区别是什么:

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
}

6 个答案:

答案 0 :(得分:15)

根据Java语言规范的第12.5 Creation of New Class Instances章:

  

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

     
      
  1. 将构造函数的参数分配给新创建的参数   此构造函数的变量   调用。
  2.   
  3. 如果此构造函数以显式构造函数调用开头   同一个类中的另一个构造函数   (使用此),然后评估   参数和进程构造函数   使用这些递归调用   同样的五个步骤。如果那个构造函数   然后,调用突然完成   这个程序突然完成了   同样的原因;否则,继续   步骤5。
  4.   
  5. 此构造函数不以显式构造函数开头   调用另一个构造函数   同一个班级(使用此)。如果这   构造函数是用于除了之外的类   对象,然后这个构造函数将   以明示或暗示开头   调用超类构造函数   (使用超级)。评估参数   并处理超类   构造函数调用递归   使用这五个相同的步骤。如果说   构造函数调用完成   突然,然后这个程序   为此突然完成   原因。否则,继续执行步骤
  6.   
  7. 执行实例初始值设定项和实例变量初始值设定项   这个类,分配的值   实例变量初始化器   相应的实例变量,in   他们的从左到右的顺序   在源代码中以文本形式出现   为了上课。如果执行任何   这些初始化器导致了   例外,然后没有进一步   初始化程序已处理完毕   程序突然完成   同样的例外。否则,继续   与第5步。(在一些早期   实现,编译器   错误地省略了代码   如果字段初始化字段   初始化表达式是一个常量   值等于的表达式   默认的初始化值   它的类型。)
  8.   
  9. 执行此构造函数的其余部分。如果执行   突然完成,然后这个   程序突然完成   同样的道理。否则,这个程序   正常完成。
  10.   

所以区别仅在于步骤(步骤4或步骤5),但结果是相同的。

答案 1 :(得分:2)

唯一的区别在于which step初始化引用。最后的效果是一样的。

答案 2 :(得分:1)

这只是一种风格问题,它编译成相同的代码。

我个人倾向于将所有实例初始化放在构造函数中,因为它适用于所有情况。

答案 3 :(得分:0)

在第一个实例中,obj将在构造函数运行之前初始化。当你有子类时,这是一个重要的细微差别。构造函数和初始化块的顺序如下:

  1. 超类初始化程序
  2. 超类构造函数
  3. 子类初始化程序
  4. 子类构造函数

答案 4 :(得分:0)

尚未提及的一个方面:

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

将obj初始化为固定值。但是在构造函数中初始化时,可以让初始化依赖于构造函数的参数,或者(使用多个构造函数)使用完全不同的初始化表达式,例如。

public class SomeClass {
    private SomeObject obj;
    public SomeClass(int length){
       obj = new SomeObject(3 * length + 7);
    }
    //rest of the code
}

答案 5 :(得分:-3)

施工时间。第一个是在输入main之前完成的。另一个对象的构造被延迟,直到调用SomeClass的ctor。

相关问题