如何调用非静态初始化程序块?

0 java initialization initializer non-static

public class A{

    {
        System.out.println("hi i am IIB");
    }

    public A(){
        System.out.println("hi i am constructor");
    }

    public static void main(String... args){
        A objA=new A();
    }

}
Run Code Online (Sandbox Code Playgroud)

Roh*_*ain 6

在调用构造函数之前,iib将执行

不,这不是发生的事情.在实例初始化程序块中编写的代码仅在运行时才是构造函数的一部分.在编译时,编译器将实例初始化程序块的代码移动到类的所有构造函数.因此,在运行时,构造函数实际上等效于:

public A() {
    super();
    System.out.println("hi i am IIB"); 
    System.out.println("hi i am constructor");
}
Run Code Online (Sandbox Code Playgroud)

因此,实例初始化程序块中的语句将在语句已经存在之前移动到构造函数.

这是构造函数实际看起来的样子(javap命令输出):

 public A();
   Code:
      0: aload_0
      1: invokespecial #1    // Method java/lang/Object."<init>":()V
      4: getstatic     #2    // Field java/lang/System.out:Ljava/io/PrintStream;
      7: ldc           #3    // String hi i am IIB
      9: invokevirtual #4    // Method java/io/PrintStream.println:(Ljava/lang/String;)V
     12: getstatic     #2    // Field java/lang/System.out:Ljava/io/PrintStream;
     15: ldc           #5    // String hi i am constructor
     17: invokevirtual #4    // Method java/io/PrintStream.println:(Ljava/lang/String;)V
     20: return
Run Code Online (Sandbox Code Playgroud)