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

时间:2009-08-29 13:06:38

标签: 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;
        }
    }
}

这永远不会输出“hi”。为什么是这样?

3 个答案:

答案 0 :(得分:24)

大括号中的代码是instance initializer

来自The Java Language Specification, Third EditionSection 8.6

  

在a中声明的实例初始值设定项   class是在一个实例时执行的   创建类(第15.9节),as   在§8.8.5.1中指定。

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

还有static initializer,其外观与实例初始值设定项相似,但前面有static个关键字:

static {
    // Executed when a class is first accessed.
}

再次,来自The Java Language Specification, Third EditionSection 8.7

  

在a中声明的任何静态初始化器   类是在类时执行的   初始化,和任何一起   类的字段初始值设定项(第8.3.2节)   变量,可用于初始化   类的类变量   (§12.4)。

来自Initializing FieldsThe Java Tutorials页面也包含有关静态和实例初始化程序块的信息。

答案 1 :(得分:1)

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

运行

答案 2 :(得分:1)

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