非静态块何时在 java 中执行?

When does the non-static block get executed in java?

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

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

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

如果它在 class 内但在方法声明之外,则它只是一个初始化程序。如果您更改代码以将块移动到任何方法之外:

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

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

然后您应该会看到实例初始化程序在实例化对象时执行。如果您不实例化一个对象,就像您的示例中那样,那么实例初始化程序将不会获得 运行.