Java中静态关键字的首选项

Java中静态关键字的首选项,java,Java,最近我在线检查一个代码,发现以下代码的输出: public class Sequence { Sequence() { System.out.print("c "); } { System.out.print("y "); } public static void main(String[] args) { new Sequence().go(); } void go()

最近我在线检查一个代码,发现以下代码的输出:

public class Sequence { 

    Sequence() { 
        System.out.print("c "); 
    }

    { 
        System.out.print("y "); 
    } 

    public static void main(String[] args) { 
        new Sequence().go(); 
    }
    void go() { 
        System.out.print("g "); 
    }

    static{
        System.out.print("x "); 
    }

} 
作为:


任何人都可以帮助我了解这段代码的功能。

这是一个考试问答题,以确保您能够确定各种构造函数和init块的执行顺序

静态初始化器 实例初始值设定项 建设者 通过使用超类,您可以使这变得更加复杂

或者通过拥有多个初始化程序块。

静态块、实例块构造函数,最后是显式调用的任何方法

有人能帮我了解一下这个代码的功能吗

当然。发生的第一件事是按照初始化类。这涉及运行类的静态初始值设定项,如所示。这里我们有一个静态初始化器,它打印x

然后,main方法创建一个Sequence实例。以下是JLS的一部分。首先调用这里的超类构造函数对象,然后调用实例初始值设定项,然后调用构造函数体。这里有一个实例初始值设定项,它输出y,还有一个构造函数体,它输出c


最后,执行go方法,打印g.

这看起来可疑地像一道考试题。要理解答案,您可以将代码的各个部分分解为:

输出c的构造函数

Sequence() { 
    System.out.print("c "); 
} 
实例初始值设定项,它打印出y

{ 
    System.out.print("y "); 
}
main方法,该方法创建序列的实例并在此实例上调用

public static void main(String[] args) {
    new Sequence().go();
}
输出g的go方法

void go() {
    System.out.print("g ");
}
打印出x的静态初始值设定项

static {
    System.out.print("x ");
}
在Java中,执行顺序是:3个主方法、5个静态初始值设定项、2个实例初始值设定项、1个构造函数、go方法4


要了解有关初始化的更多信息,请阅读教程:

下次请正确缩进代码。然后你会得到更多的答案,更少的反对票。调试它,你会知道,比任何解释都好。感谢Uwe和Maroun确实静态块没有被移动到构造函数中,但初始化块会。感谢Soren,如果调试不可用,它是检查流的最佳方法
static {
    System.out.print("x ");
}