1

我无法理解以下代码的执行。我想遵循 Java 程序,以便了解一切如何协同工作。我在 Eclipse 中设置断点,但没有解释原因。这是代码:

public class Sequence {
    public 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 ");
    }
}

代码的输出是x y c g. 有人可以解释这是为什么吗?我以为程序入口点是,public static void main但它似乎static首先执行?

4

6 回答 6

3

static块在main开始之前执行,所以x打印出来。

然后我们进入main,我们调用

new Sequence().go();

它调用Sequence构造函数。根据静态块,调用构造函数之前(因此Sequence在初始化新Sequence对象之前),实例块(写在大括号中的那个)被执行,因此y被打印。

然后构造函数调用 prints c

最后,该go()方法在新创建的对象上被调用,因此g被打印出来。

所以完整的输出将是

x y c g
于 2013-10-17T19:44:43.100 回答
2

JLS 在这里有帮助,准确地说是第 12 章。

首先,该static块将运行。当类被ClassLoader.

然后main会运行,这是由JVM执行来启动应用程序的。

然后在您调用时执行您的构造函数new Sequence()。编译器会将您的实例初始化程序(大括号中的位)拉到构造函数的顶部(在对超类构造函数的隐式调用之后)。因此,大括号中的位首先运行,然后是构造函数中的代码。

最后go()调用该方法。

所以代码的输出是x y c g

于 2013-10-17T19:45:29.730 回答
1

在你的课堂上你使用过

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

    //instance init block
    {
        System.out.print("y "); 
    }

    //method
    void go() {
        System.out.print("g ");
    }

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

-> 初始化块按照它们出现的顺序执行。

-> 静态初始化块在类首次加载时运行一次。

-> 实例初始化块在每次创建类实例时运行。

-> 实例初始化块在构造函数调用 super() 之后运行。

->构造函数在创建实例后运行。

根据你得到的所有规则,如预期的x y c g 输出

于 2013-10-17T19:57:10.040 回答
1

Java 在类加载之后和任何方法之前执行静态块。Main 方法是任何程序的入口点,但它是一个方法,然后是静态类初始化。

于 2013-10-17T19:57:39.887 回答
1

第一个 jvm 在应用程序启动时加载静态块。所以首先执行静态块。然后开始执行 main 方法。

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

是构造函数块,它将被复制到每个构造函数中,因此当您实例化类时,每次都会调用它。点击这里

于 2013-10-17T20:03:44.220 回答
1

脚步:

一世。加载类时,首先执行静态块。

ii. 每次实例化该类的对象时,然后初始化块,即

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

 is executed(every time) and after that the time of constructor comes to be executed.

iii. 对象创建完成后,执行 go() 方法。因此输出。

于 2015-02-08T06:05:50.220 回答