Closed. This question needs details or clarity。它当前不接受答案。
                            
                        
                    
                
            
                    
                
                        
                            
                        
                    
                        
                            想改善这个问题吗?添加详细信息并通过editing this post阐明问题。
                        
                        6年前关闭。
                    
                
        

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();
    }

}

最佳答案

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


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

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


因此,实例初始化程序块中的语句在该语句已存在之前已移至构造函数。

这是构造函数的实际外观(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

关于java - 非静态初始化程序块如何调用? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20593606/

10-10 09:38