这样做之间的区别是什么:
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
}
答案 0 :(得分:15)
根据Java语言规范的第12.5 Creation of New Class Instances章:
在引用之前 创建的对象作为返回 结果,指示的构造函数是 处理以初始化新对象 使用以下程序:
- 将构造函数的参数分配给新创建的参数 此构造函数的变量 调用。
- 如果此构造函数以显式构造函数调用开头 同一个类中的另一个构造函数 (使用此),然后评估 参数和进程构造函数 使用这些递归调用 同样的五个步骤。如果那个构造函数 然后,调用突然完成 这个程序突然完成了 同样的原因;否则,继续 步骤5。
- 此构造函数不以显式构造函数开头 调用另一个构造函数 同一个班级(使用此)。如果这 构造函数是用于除了之外的类 对象,然后这个构造函数将 以明示或暗示开头 调用超类构造函数 (使用超级)。评估参数 并处理超类 构造函数调用递归 使用这五个相同的步骤。如果说 构造函数调用完成 突然,然后这个程序 为此突然完成 原因。否则,继续执行步骤
- 执行实例初始值设定项和实例变量初始值设定项 这个类,分配的值 实例变量初始化器 相应的实例变量,in 他们的从左到右的顺序 在源代码中以文本形式出现 为了上课。如果执行任何 这些初始化器导致了 例外,然后没有进一步 初始化程序已处理完毕 程序突然完成 同样的例外。否则,继续 与第5步。(在一些早期 实现,编译器 错误地省略了代码 如果字段初始化字段 初始化表达式是一个常量 值等于的表达式 默认的初始化值 它的类型。)
- 执行此构造函数的其余部分。如果执行 突然完成,然后这个 程序突然完成 同样的道理。否则,这个程序 正常完成。
醇>
所以区别仅在于步骤(步骤4或步骤5),但结果是相同的。
答案 1 :(得分:2)
唯一的区别在于which step初始化引用。最后的效果是一样的。
答案 2 :(得分:1)
这只是一种风格问题,它编译成相同的代码。
我个人倾向于将所有实例初始化放在构造函数中,因为它适用于所有情况。
答案 3 :(得分:0)
在第一个实例中,obj
将在构造函数运行之前初始化。当你有子类时,这是一个重要的细微差别。构造函数和初始化块的顺序如下:
答案 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。