从文档:
Java编译器将初始化程序块复制到每个构造函数中。因此,该方法可用于在多个构造函数之间共享代码块。
上面的陈述有些误导,因为如果按照上面文档的解释,我们可以像这样重写原始代码:
public class WrongVersionOfWhyIsThisOk { int a = 10; public WhyIsThisOk (){ a = 5; } public static void main(String[] args){ WrongVersionOfWhyIsThisOk why = new WrongVersionOfWhyIsThisOk (); System.out.println(why.a); }}但是运行
WrongVersionOfWhyIsThisOk将产生5而不是原始代码产生的10。
但是实际上,初始化程序块和变量赋值都被复制到构造函数中:
public class RightVersionOfWhyIsThisOk { int a; public RightVersionOfWhyIsThisOk (){ a = 5; a = 10; } public static void main(String[] args){ RightVersionOfWhyIsThisOk why = new RightVersionOfWhyIsThisOk (); System.out.println(why.a); }}更新:
这是文档,详细描述了初始化顺序和构造函数调用:
4)执行该类的实例初始化器和实例变量初始化器,并按照从左到右的顺序将实例变量初始化器的值在文本中显示在该类的源代码中,并将它们分配给相应的实例变量。如果执行这些初始化程序中的任何一个导致异常,则不会再处理其他初始化程序,并且该过程会因相同的异常而突然完成。否则,请继续执行步骤5。
5)执行此构造函数的其余部分。如果该执行突然完成,则出于相同原因,此过程也会突然完成。否则,此过程将正常完成。



