请考虑以下代码: -
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”。为什么是这样?
答案 0 :(得分:24)
大括号中的代码是instance initializer。
来自The Java Language Specification, Third Edition,Section 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 Edition,Section 8.7:
在a中声明的任何静态初始化器 类是在类时执行的 初始化,和任何一起 类的字段初始值设定项(第8.3.2节) 变量,可用于初始化 类的类变量 (§12.4)。
来自Initializing Fields的The Java Tutorials页面也包含有关静态和实例初始化程序块的信息。
答案 1 :(得分:1)
我认为它仅在实例创建时激活。尝试将其作为静态{...}
运行答案 2 :(得分:1)
应该将块声明为静态以使其运行,即static {System.out.println(“hi”);}