Java:奇怪的静态方法头定义(表达式而不是返回类型)

Java:奇怪的静态方法头定义(表达式而不是返回类型),java,Java,可能重复: 我正在为不久的将来的OCJPC做准备,我遇到了一个我以前从未见过的构造。由于谷歌很难找到编程结构,我在这里提出这个问题。代码片段: class Geryon { static { System.out.print("a"); } { System.out.print("b"); } Geryon(String s) { System.out.print(s); } public static void main(String[] args) {

可能重复:

我正在为不久的将来的OCJPC做准备,我遇到了一个我以前从未见过的构造。由于谷歌很难找到编程结构,我在这里提出这个问题。代码片段:

class Geryon {
    static { System.out.print("a"); }
    { System.out.print("b"); }
    Geryon(String s) { System.out.print(s); }

    public static void main(String[] args) {
        new Geryon("c");
    }
}
我指的是
theGeryon()
methodheader中的两条print语句,在这里我希望返回类型。据我所知,一个静态方法头包括:

access-modifier keyword-"static" return-type|void method-name

从问答题的答案判断,代码不仅可以编译,还可以运行。有人能告诉我解释这一点的来源吗?

a是一个静态初始值设定项,当类由classloader初始化时会调用它,它:

 static { System.out.print("a"); }
另一个(B)是一个匿名块,每次实例化该类时都会调用它:

{ System.out.print("b"); }
第三个print语句,C,只是一个普通的构造函数调用


如果实例化一个Geryon,您将得到所有三行,就像您发布的代码一样。但是下次你实例化一个Geryon时,你只会得到两个-B和C;因为它已经被classloader初始化,所以静态块不会被调用。

@AVD:Question没有非静态块
{…}
谢谢,这正是答案。我目前正在浏览Java语言规范,它必须在那里的某个地方。@0xCAFEBABE-尝试搜索目录或索引。。。或PDF版本。