考虑如下。
public class H{
int a;
public H(){
a=5;
}
public H(String x){
this();
}
{a=0;}
public static void main(String []a){
System.out.print(new H("").a);
}
}
O / P 5 表示初始化块首先在this()之前执行,但根据Why do this() and super() have to be the first statement in a constructor?,第一个语句应为this()。怎么会发生.. ???
答案 0 :(得分:4)
如果您了解构造函数链接
第一个新的H("")调用你的参数化构造函数,它找到this()
所以调用转到非参数化构造函数,首先执行初始化程序,然后将初始化程序初始化为零然后再次,你的a =5
将a设置为5,最后打印5
答案 1 :(得分:3)
JLS非常具体(强调我的):
在作为结果返回对新创建的对象的引用之前,处理指示的构造函数以使用以下过程初始化新对象:
将构造函数的参数分配给此构造函数调用的新创建的参数变量。
如果此构造函数以同一个类中的另一个构造函数的显式构造函数调用(第8.8.7.1节)开头(使用
this
),则评估参数并处理该构造函数使用这五个相同的步骤递归地构造函数调用 。如果该构造函数调用突然完成,则此过程突然完成,原因相同;否则,继续步骤5.此构造函数不以同一类中另一个构造函数的显式构造函数调用开头(使用此方法)。如果此构造函数用于Object以外的类,则此构造函数将以超类构造函数的显式或隐式调用开始(使用super)。使用这五个相同的步骤评估参数并递归处理超类构造函数调用。如果该构造函数调用突然完成,则此过程突然完成,原因相同。否则,请继续执行步骤4.
为此类执行实例初始值设定项和实例变量初始值设定项,将实例变量初始值设定项的值分配给相应的实例变量,按从而出现的从左到右的顺序在文本的源代码中。如果执行任何这些初始值设定项导致异常,则不会处理其他初始化程序,并且此过程会突然完成同样的异常。否则,请继续步骤5.
- 醇>
执行此构造函数的其余部分。如果执行突然完成,则此过程突然完成,原因相同。否则,此过程正常完成。
第2节中的粗体文字表示当它执行this
时,它将再次调用这样的构造函数调用这五个步骤。由于您在没有参数的情况下调用this()
,它将遵循这些步骤,但由于没有调用this()
,因此不执行第2步,而是执行步骤3和4,在步骤4中执行将为该类执行实例初始值设定项和实例变量初始值设定项。然后控件将返回执行a = 5
。