"{}"中的主类块永远不会执行

Aja*_*jay 1 java puzzle

请考虑以下代码: -

class Name {

    {System.out.println("hi");}

    public static void main(String[] args) {
        System.out.println(waffle());
    }

    static boolean waffle() {
        try {
            return true;
        } finally {
            return false;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这从不输出"hi".为什么是这样?

coo*_*ird 24

大括号中的代码是实例初始化程序.

来自Java语言规范,第三版,第8.6节:

在创建类的实例(第15.9节)时,将在类中声明的实例初始值设定项执行,如§8.8.5.1中所述.

如果Name执行该类,则该public static void main(String[])方法由Java虚拟机调用,但Name该类未实例化,因此实例初始化程序中的代码将永远不会被执行.

还有一个静态初始化程序,它在外观上与实例初始化程序类似,但static前面有关键字:

static {
    // Executed when a class is first accessed.
}
Run Code Online (Sandbox Code Playgroud)

同样,来自The Java Language Specification,Third Edition,Section 8.7:

在类初始化时执行在类中声明的任何静态初始化程序,并且与类变量的任何字段初始值设定项(第8.3.2节)一起,可以用于初始化类的类变量(第12.4节).

The Java Tutorials中Initializing Fields页面还包含有关静态和实例初始化程序块的信息.