JAVA是一门面向对象的编程语言,在面试的时候除了一道题,把我搞蒙了。代码块和构造器,谁先执行?

答案是肯定的了: 不考虑继承的情况下,1静态代码块,2代码块,3构造器

说明: 
不考虑继承关系,一般的类里面包含: 
1、静态代码块(静态区、静态变量等/用static修饰的) 
2、代码块(一块代码/j就是用{}抱起来的代码) 
3、构造方法(默认的,无参的,有参的构造器)

new一个对象时,其执行顺序也是1、2、3先后执行,特别强调的是:代码块优先构造器执行 


考虑继承关系:子类与父类的执行顺序是: 
1、先执行父类的静态代码块(父1) 
2、子类的静态代码块(子1) 
3、父类构造代码块(父2) 
4、父类构造方法(父3) 
5、子类构造代码块(子2) 
6、子类构造方法(子3)

当一个类从被JVM装载开始,各种代码的执行顺序大致如下:

这里的执行顺序同子类构造中有一个默认的父类构造super()无关,不是执行到隐藏的super()才开始初始化父类的,类的初始化是分层初始化:

1.即先初始化父类,再初始化子类,初始化每个类的过程中,进行类的初始化工作,

2.先进性成员变量的初始化,成员变量的初始化顺序是:默认初始化,即int为0这种->显示初始化,例如给int型显示初始化了值->构造方法初始化,所以是这里执行到了构造方法。 

但是一定要注意,父类初始化选择的构造方法却和子类中super 选择的构造相关。


先看一个实例,证实以上结论:

package com.gzu.pyu.thinking.in.java;

public class JavaExecutionOrder {
    
    public static void main(String[] args) {

        new HelloA();        
//        new HelloB();        
    }

}


class HelloB extends HelloA{    
     
    HelloB(){
       System.out.println("HelloB constructor");
    }
    
    static{
        System.out.println("HelloB static code block");
    }
    
    {
        System.out.println("HelloB code block");
    }
}

class HelloA{
    
    HelloA(){
       System.out.println("HelloA constructor");
    }
    
    static{
        System.out.println("HelloA static code block");
    }
    
    {
        System.out.println("HelloA code block");
    }
}

 

不考虑继承关系,先执行new HelloA();结果如下:

 

考虑继承关系,先执行new HelloB();结果如下: