关于包含继承的构造函数和构造代码块执行顺序的问题

1.源码

class Fu {
    int num=9;
    static int b=3;
    static final int a=6;
    static{
        System.out.println("fu...静态代码块执行...a="+a+",b="+b);
    }
    {
        System.out.println("fu"+"...num="+num+",a="+a+",b="+b);
    }
    Fu(){
        super();//object
        System.out.println("fu constructor run...num="+num+",a="+a+",b="+b);
        //显示初始化
        //构造代码块初始化
        show();
    }
​
    void show() {
        System.out.println("呵呵");//被覆盖,运行子类的show方法
    }
}
​
class Zi extends  Fu{
    int num=8;
    static int b=2;
    static final int a=5;
    static{
        System.out.println("zi...静态代码块执行...a="+a+",b="+b);
    }
    {
        System.out.println("zi"+"...num="+num+",a="+a+",b="+b);
​
    }
​
    Zi() {
        super();
        //先显示初始化
        //再构造代码块初始化
        show();
    }
​
    void show() {
        System.out.println("show ...num="+num+",a="+a+",b="+b);
    }
}
​
public class Test {
    public static void main(String[] args) {
        new Zi();
    }
}

2.运行结果

fu...静态代码块执行...a=6,b=3
zi...静态代码块执行...a=5,b=2
fu...num=9,a=6,b=3
fu constructor run...num=9,a=6,b=3
show ...num=0,a=5,b=2
zi...num=8,a=5,b=2
show ...num=8,a=5,b=2

3.执行步骤

  1. 将用到的类加载到内存的方法区, 并将static关键字修饰的成员变量显示初始化,同时执行静态代码块(注意,是先执行父类构造代码块,再执行子类构造代码块)

  2. 给成员变量赋默认值(此时两个num都为0)

  3. 在test类中执行 new Zi();

  4. 执行子类的无参构造函数

  5. 执行子类无参构造函数中的super();

  6. 执行父类中的无参构造函数;

  7. 执行父类无参构造函数中的super();

  8. 父类中的num显示初始化 num=9;

  9. 执行父类的构造代码块 (控制台输出 fu )

  10. 执行父类中的 System.out.println("fu constructor run..."+num); 输出' fu constructor run...9 '

  11. 执行show();方法, 由于子父类中都存在show方法,所以调用子类的show方法. 由于子类中的num还未显示初始化,所以控制台输出"show ...0"

  12. 此时,子类无参构造方法中的super()方法执行完成, 子类的成员变量开始显示初始化,既int num=8;

  13. 子类构造代码块执行,控制台输出 "zi"

  14. 子类构造方法执行show()方法,此时控制台输出"show ...8"

    以上即为 new Zi();的执行过程.

转载于:https://my.oschina.net/u/4081751/blog/3011631

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值