静态代码块 构造代码块 构造方法的执行顺序及注意问题

先贴代码:

class Fu{
    static{
        System.out.println("父类静态代码块");
    }

    {
        System.out.println("父类构造代码块");
    }
    public Fu(){
        System.out.println("父类构造方法");
    }
}
class Zi extends Fu {
    static{
        System.out.println("子类静态代码块");
    }
    {
        System.out.println("子类构造代码块");
    }
    public Zi(){
        System.out.println("子类构造方法");
    }
}
public class Test {
    public static void main(String[] args) {
        Zi zi=new Zi();
    }
}

首先能肯定的是静态代码块是随着类的加载而加载,而构造代码块和构造方法都是随着对象的创建而加载

编译时,先加载父类,所以Fu类的静态代码块首先执行,而后加载Zi类,Zi类的静态代码块执行

然后创建Zi的对象,大家都知道构造代码块优先于构造方法执行,这时候问题来了,这时应该先看Zi类的构造方法,Zi类里的构造方法里有一句隐式的super()首先被执行,所以找到Fu类的构造方法,而Fu类的构造方法中也有一句隐式的super()执行(调用Object类的构造方法),并没有什么返回结果,接下来才是在执行Fu类构造方法的方法体前先执行了Fu类的构造代码块,再执行Fu类构造方法的方法体,最后又回到Zi类的构造方法中,这时Zi类的super()已经执行完了,在执行Zi类构造方法的方法体前先执行Zi类的构造代码块,再执行Zi类构造方法的方法体

所以执行结果为:

父类静态代码块
子类静态代码块
父类构造代码块
父类构造方法
子类构造代码块
子类构造方法

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LoneWalker、

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值