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

首先先看一段代码:

class Dad{
    static {
        System.out.println("Dad static code");
    }
    {
        System.out.println("Dad code");
    }
    public Dad(){
        System.out.println("Dad GouZao");
    }
}

class Son extends Dad{
    static {
        System.out.println("Son static code");
    }
    {
        System.out.println("Son code");
    }
    public Son (){
        System.out.println("Son GouZao");
    }
}

public class Text{
    public static void main(String[] args) {
        Son son = new Son ();
    }
}

1,在编译Text.java时,先加载了Dad类,因此Dad类的静态代码块首先执行,而后加载Son类,Son类的静态代码块执行,这没什么好说的

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

最后的结果是:

        Dad static code
        Son  static code
        Dad code
        Dad GouZao
        Son  code
        Son  GouZao

不知道大家绕晕了没有,我在这再总结一下:静态的是与类有关,肯定先加载,而构造代码块执行前要先看构造方法中是否有this()或super(),有的话在其之后执行,最后执行构造方法的方法体

(有理解不对的地方还请大家指点,一起交流探讨)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值