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

0xC*_*ABE 2 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) {
        new Geryon("c");
    }
}
Run Code Online (Sandbox Code Playgroud)

我指的是theGeryon()方法头中的2个print语句,我希望返回类型.至于我能够谷歌,静态方法标题包括:

access-modifier keyword-"static" return-type|void method-name
Run Code Online (Sandbox Code Playgroud)

从测验问题的答案来看,代码不仅可以编译,还可以运行.任何人都可以指导我这个解释的来源吗?

Nim*_*sky 6

A是一个静态初始化程序,在类加载器初始化类时调用它,这个:

 static { System.out.print("a"); }
Run Code Online (Sandbox Code Playgroud)

另一个(B)是一个匿名块,每次实例化时都会调用它:

{ System.out.print("b"); }
Run Code Online (Sandbox Code Playgroud)

哦,第三个打印语句C只是一个普通的构造函数调用.

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