什么时候在java中执行非静态块?

时间:2015-04-14 15:57:22

标签: java static block non-static

我预计非对象块总是在创建对象时执行。但在下面的示例中,我调用了静态方法,但执行了非静态块。我没有创建任何对象,为什么非静态块执行?

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

1 个答案:

答案 0 :(得分:9)

您的示例中没有非静态初始化块。方法内部的块只是作为方法的一部分执行的代码。 (嵌套代码块引入了一个新范围,因此您可以创建在块外部不可见的变量。)

如果它在类中但在方法声明之外,它只是一个初始化器。如果更改代码以将块移动到任何方法之外:

class Example {
    static void Mark() {
        System.out.println("Mark method");
    }

    // now it's an instance initializer
    {
        System.out.println("Hello");
    }
}   

然后您应该在实例化对象时看到实例初始化程序执行。如果没有实例化对象(如示例中所示),则实例初始化程序将无法运行。