请考虑以下代码: -
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
大括号中的代码是实例初始化程序.
在创建类的实例(第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页面还包含有关静态和实例初始化程序块的信息.