Java 什么';在字段中实例化和在构造函数中实例化有什么区别?
这样做的区别是什么:Java 什么';在字段中实例化和在构造函数中实例化有什么区别?,java,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 } 施工时间。第一个是在输入
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
}
施工时间。第一个是在输入main之前完成的。另一个对象的构造被延迟,直到调用某个类的ctor为止。在第一个实例中,
obj
将在构造函数运行之前初始化。当您有子类时,这是一个重要的细微差别。构造函数和初始化块的顺序为:
唯一的区别是在引用被初始化时。最终效果相同。根据Java语言规范的章节: 就在提到新的 创建的对象将作为 结果,指示的构造函数为 已处理以初始化新对象 使用以下程序:
因此,不同之处在于步骤(步骤4或步骤5),但结果是相同的。这只是风格问题,它编译为相同的代码
就我个人而言,我倾向于将实例的所有初始化放在构造函数中,因为这对所有情况都是一致的。一个方面尚未提及:
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
}
这不是我对JLS第12.5条的解释,我认为这不是真的,这是错误的。javac在调用超级构造函数后在构造函数中生成代码。我理解C#是不同的(但你不能在这样的表达式中使用
this
)(第一个示例将在运行构造函数之前创建SomeObject…正确吗?答案就像从JLS复制的@Pascal一样,请参见#4和#5)。