1

考虑以下代码:-

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

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

4

3 回答 3

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.
}

同样,来自Java 语言规范,第三版第 8.7 节

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

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

于 2009-08-29T13:08:13.897 回答
1

我认为它仅在实例创建时被激活。尝试将其作为静态 { ... } 运行

于 2009-08-29T13:10:17.470 回答
1

该块应声明为静态以使其运行,即 static{System.out.println("hi");}

于 2009-08-29T13:11:03.587 回答