探究java类的加载顺序

基类

public class Father {

    private int i = testFather(); // 6
    private static int f = method();// 1

    static {
        System.out.println("父类静态代码块被加载");// 2
    }

    private static int f2 = method2();// 3


    Father(){ // 9
        System.out.println("父类构造函数被加载");
    }

    {
        System.out.println(" 父类 普通代码块 被加载");  // 7
    }
    private int j = test1();  // 8 此处实际调用子类的 test1

    public int testFather() {

        System.out.println("父类成员变量i被加载");
        return 1;
    }
    public static int method(){
        System.out.println("父类静态变量f被加载");
        return 1;
    }
    private static int method2() {
        System.out.println(" 父类静态变量f2被加载 ");
        return 0;
    }

    public int test1() {

        System.out.println("父类test1执行");
        return 1;
    }
}

子类

public class Son extends Father {


    {
        System.out.println(" 子类普通代码块 ");// 10
    }

    private int i = test1(); // 11

    private static int f = method();// 4

    static {
        System.out.println(" 子类静态代码块 "); // 5
    }
    Son(){
        System.out.println(" 子类构造函数 ");
    }// 12



    public int test1() {

        System.out.println(" 子类test1被执行");
        return 1;
    }


    public static int method(){
        System.out.println(" 子类静态变量f加载");
        return 1;
    }


}

测试类

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

        System.out.println("开始");

        Father father1  = new Son();
        System.out.println("---以下是father2 ----");
        Father father2 = new Son();
    }

 }

运行结果

在这里插入图片描述

执行顺序已经在代码中标注出加粗样式来了

结论

父类静态代码块或者父类静态变量>子类静态代码块或者子类静态变量>父类成员变量或父类构造代码块>父类构造函数>子类成员变量或子类构造代码块>子类构造函数

补充:静态代码块和静态变量处在同一优先级,成员变量和构造代码块处在同一优先级,都是谁位置靠前,先加载谁

特别注意:当两个类是继承关系时,父类调用“子类覆写”了的方法时,其实是调用的子类的方法

即上诉代码中的第八步,父类中private int j = test1();实际是调用的子类的test1方法

详情参见
阿里巴巴难度系数五颗星的试题,小白竟然说很简单https://blog.csdn.net/leisure_life/article/details/108681214

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值