Java 构造函数中的字段初始化
在 Java 中,字段初始化和构造函数代码的执行顺序一直是一个令人困惑的话题。提供的代码演示了这种行为:
class X { Y b = new Y(); X() { System.out.print("X"); } } class Y { Y() { System.out.print("Y"); } } public class Z extends X { Y y = new Y(); Z() { System.out.print("Z"); } public static void main(String[] args) { new Z(); } }
基于构造函数在实例变量之前初始化的假设,人们可能期望输出为“XZYY”。然而,实际输出是“YYXZ”:
此输出与预期顺序相矛盾,因为字段初始化(例如,'b ' 和 'y')发生在构造函数体执行之前(例如,'X()' 和'Z()')。
Java 虚拟机规范 (JVM Spec) 明确了初始化的顺序如下:
因此,在提供的代码中,实例变量 'b' 和 'y' 被初始化在执行“X”和“Z”的构造函数主体之前,导致输出“YYXZ”。
以上是Java 中字段初始化和构造函数执行的实际顺序是什么?的详细内容。更多信息请关注PHP中文网其他相关文章!