一尘不染

调用不带名称的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() {
        System.out.print("g ");
    }

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

我期望这样做会导致编译错误,因为System.out带有“ y”的不仅仅属于方法声明{ }。为什么这样有效?我不知道如何或应该调用此代码。

运行它时x y c g,它还会产生,为什么static { }在序列构造函数之前调用get?


阅读 214

收藏
2020-09-09

共1个答案

一尘不染

这个:

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

是一个 静态初始化块 ,并在加载类时调用。您可以根据需要在类中添加任意数量的对象,它们将按照其出现顺序(从上到下)执行。

这个:

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

是一个 初始化块
,并将代码复制到该类的每个构造函数的开头。因此,如果您的类有许多构造函数,并且它们都需要在开始时做一些普通的事情,则只需编写一次代码,并将其放在这样的
初始化块中

因此,您的输出非常合理。

正如Stanley在下面评论的那样,有关更多信息,请参见Oracle教程中描述初始化块的部分

2020-09-09