问题

我正在看下面的代码,发现有点奇怪的东西:

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

我希望这会给出编译错误,因为System.out与"y"不属于方法声明只是a{ }。为什么这个有效?我没有看到这个代码将如何或应该被调用。

运行它时它产生x y c g也是,为什么在序列构造函数之前调用了882136640get?


#1 热门回答(146 赞)

这个:

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

是静态初始化块,并在加载类时调用。你可以根据需要在课堂上拥有尽可能多的课程,并按照外观(从上到下)执行。

这个:

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

是一个初始化块,代码被复制到类的每个构造函数的开头。因此,如果你的类中有许多构造函数,并且它们都需要在开头时执行一些常见操作,那么你只需要编写一次代码并将其置于初始化块中。

因此,你的输出非常有意义。

有关更多信息,请参见下面的84246606和AsStanley


#2 热门回答(25 赞)

它不是一种方法,而是a初始化块

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

它将在构造函数调用之前执行。而

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

is静态初始化块,当类加载器加载类时执行。

所以当你运行你的代码
1.类由类加载器加载,因此执行静态初始化块
输出:打印x
2.创建对象,以便执行初始化块,然后调用constuctor
输出:打印y后跟c
3.调用main方法,然后调用go方法
输出:g打印

最终输出:x y c g
这可能有助于http://blog.sanaulla.info/2008/06/30/initialization-blocks-in-java/


#3 热门回答(16 赞)

这是a实例初始化块,后跟a静态初始化块

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

在创建类的实例时调用。

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

在类加载器加载类时调用。所以,当你这样做

new Sequence().go();

该类被加载,因此执行static {},然后执行实例初始化block{},然后调用构造函数的主体,然后调用新创建的实例上的方法。因此输出x y c g


原文链接