在Java中运行构造函数代码之前是否初始化了字段?

在Java中运行构造函数代码之前是否初始化了字段?

有人能解释下程序的输出吗?我认为构造函数是在实例变量之前初始化的。所以我希望输出是“XZYY”。

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();
    }}



POPMUISE
浏览 546回答 3
3回答

哔哔one

初始化的正确顺序是:静态变量初始化器和静态初始化块(按文本顺序排列),如果类以前没有初始化的话。函数中的超级()调用,无论是显式的还是隐式的。实例变量初始化器和实例初始化块,按文本顺序排列。在Super()之后保留构造函数体。见各节§2.17.5-6的Java虚拟机规范.

郎朗坤

如果您查看类文件的反编译版本class X {     Y b;     X() {         b = new Y();         System.out.print("X");     }}class Y {     Y() {         System.out.print("Y");     }}public class Z extends X {     Y y;     Z() {         y = new Y();         System.out.print("Z");     }     public static void main(String args[]) {         new Z();     }}您可以发现实例变量y在构造函数中移动,因此执行顺序如下调用Z的默认构造函数。X第一行X构造器new Y()叫做。打印Y打印X调用构造函数Z中的第一行new Y()列印Y打印Z所有实例变量都是使用构造函数语句初始化的。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java