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

Alb*_*una -4 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();
  }
}
Run Code Online (Sandbox Code Playgroud)

结果:

Mark method
Hello
Run Code Online (Sandbox Code Playgroud)

Nat*_*hes 9

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

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

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

    // now it's an instance initializer
    {
        System.out.println("Hello");
    }
}   
Run Code Online (Sandbox Code Playgroud)

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