关于静态块、静态属性、构造块、构造方法的执行顺序

示例代码

public class HelloA {
    
    private static String staticStr = getStaticStr();
    private String str = getStr();
    
    //父类构造方法
    public HelloA(){
        System.out.println("父类构造方法");
    }
    //父类代码块
    {
        System.out.println("父类代码块");
    }
    //静态代码块
    static{
        System.out.println("父类静态代码块");
    }
    
    //父类静态属性初始化
    private static String getStaticStr() {
        System.out.println("父类静态属性初始化");
        return null;
    }
    
     private String getStr() {
          System.out.println("父类实例属性初始化");
          return null;
     }
}

 class HelloB extends HelloA {
     private static String staticStr = getStaticStr();
     private String str = getStr();
    //构造方法
    public HelloB(){
         System.out.println("子类构造方法");
    }
    //子类代码块
    {
        System.out.println("子类代码块");
    }
    //子类静态代码块
    static{
            System.out.println("子类静态代码块");
    }    
    
    //子类静态属性
    private static String getStaticStr() {
        System.out.println("子类静态属性初始化");
        return null;
    }
    
    //子类实例属性初始化
    private String getStr() {
         System.out.println("子类实例属性初始化");
         return null;
    }
    
}

执行一次  new HelloB();

执行顺序:加载父类类对象:父类静态属性 > 父类静态块>

                  加载子类类对象:子类静态属性>子类静态块 >

                   父类实例化:父类实例属性初始化 > 父类普通代码块>父类构造方法 >

                   子类实例化:子类实例属性初始化 > 子类普通代码块>子类构造方法>

 执行多次  new HelloB(); new HelloB() (此类被加载过,不再加载父类和子类的类对象,则只加载一次)

执行顺序:加载父类类对象:父类静态属性 > 父类静态块>

                  加载子类类对象:子类静态属性>子类静态块 >

                   父类实例化:父类实例属性初始化 > 父类普通代码块>父类构造方法 >

                   子类实例化:子类实例属性初始化 > 子类普通代码块>子类构造方法>               

                   父类实例化:父类实例属性初始化 > 父类普通代码块>父类构造方法 >

                   子类实例化:子类实例属性初始化 > 子类普通代码块>子类构造方法>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章