我预计非对象块总是在创建对象时执行。但在下面的示例中,我调用了静态方法,但执行了非静态块。我没有创建任何对象,为什么非静态块执行?
class Example {
static void Mark() {
System.out.println("Mark method");
{
System.out.println("Hello");
}
}
}
public class StaticObject {
public static void main(String[] args) {
Example.Mark();
}
}
结果:
Mark method
Hello
答案 0 :(得分:9)
您的示例中没有非静态初始化块。方法内部的块只是作为方法的一部分执行的代码。 (嵌套代码块引入了一个新范围,因此您可以创建在块外部不可见的变量。)
如果它在类中但在方法声明之外,它只是一个初始化器。如果更改代码以将块移动到任何方法之外:
class Example {
static void Mark() {
System.out.println("Mark method");
}
// now it's an instance initializer
{
System.out.println("Hello");
}
}
然后您应该在实例化对象时看到实例初始化程序执行。如果没有实例化对象(如示例中所示),则实例初始化程序将无法运行。