java创建对象时类的加载顺序

执行顺序

父类静态变量 or 父类静态代码块[看位置,顺序执行,从上往下]
子类静态变量 or子类静态代码块[看位置,顺序执行,从上往下]
父类非静态变量 or 父类非静态代码块[看位置,顺序执行,从上往下]
父类构造方法
子类非静态变量 or 子类非静态代码块[看位置,顺序执行,从上往下]
子类构造方法

注:
静态代码块只执行一次
因为static修饰的在类被加载时也被加载 (https://www.cnblogs.com/lwthad/p/10253322.html)

public class CLazzExecutionOrder {
    
    

    public static void main(String[] args) {
    
    
        System.out.println("main方法开始执行了");
        System.out.println("===============================");
        Son son = new Son();
        System.out.println("===============================");
        Son son1 = new Son();
        System.out.println("===============================");
        System.out.println("main方法执行完成了");
    }

}

class Father {
    
    
    // 代码顺序靠前,越早执行;
    private String name = setName() ;
    {
    
    
        System.out.println("执行父类的普通代码块");
    }

    // 静态代码块 和静态变量,和代码顺序有关,代码顺序靠前,越早执行;
    private static int age =  setAge();
    static{
    
    
        System.out.println("执行父类的静态代码块");
    }
    
    public Father() {
    
    
        System.out.println("执行父类的构造方法");
    }

    private String setName() {
    
    
        System.out.println("执行父类普通变量的赋值");
        return  "Bob";
    }

    private static int setAge() {
    
    
        System.out.println("执行父类静态变量的赋值");
       return  233244;
    }

}

class Son  extends Father{
    
    

    private int no = setNo();

    private int setNo() {
    
    
        System.out.println("执行子类普通变量的赋值");
        return 9527;
    }

    private static int num = setNum();

    private static int setNum() {
    
    
        System.out.println("执行子类静态变量的赋值");
        return 118;
    }

    static{
    
    
        System.out.println("执行子类的静态代码块");
    }
    {
    
    
        System.out.println("执行子类的普通代码块");
    }

    public Son() {
    
    
        System.out.println("执行子类的构造方法");
    }

}

执行顺序

main方法开始执行了
===============================
执行父类静态变量的赋值
执行父类的静态代码块
执行子类静态变量的赋值
执行子类的静态代码块
执行父类普通变量的赋值
执行父类的普通代码块
执行父类的构造方法
执行子类普通变量的赋值
执行子类的普通代码块
执行子类的构造方法
===============================
执行父类普通变量的赋值
执行父类的普通代码块
执行父类的构造方法
执行子类普通变量的赋值
执行子类的普通代码块
执行子类的构造方法
===============================
main方法执行完成了

参考:https://blog.csdn.net/weixin_42324471/article/details/95943537

猜你喜欢

转载自blog.csdn.net/loveyour_1314/article/details/109712987
今日推荐