A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 NBoss 于 2016-9-7 12:20 编辑

前几天在读Think in java时的构造函数初始化时读到了一个很有趣的东西,就是子父类初始化的顺序    先说一下正常情况下初始化一个类,不考虑父类问题,当加载一个类的时候会先为这个类的静态态代码块开辟空间,然后为静态成员变量和静态成员方法初始化,类加载在方法区加载完毕,当创建这个类的对象是会调用这个类的构造代码块,然后初始化非静态成员变量,最后调用构造方法,总的来说就是先静态再非静态。
  现在说一下比较有意思的东西,完全颠覆理解,当带上父类的时候,先上图

会先将父类的初始化一遍在初始化子类,这时有一个非常有趣的的地方就是,调用完父类构造方法后,调用子类普通成员初始化,再子类构造方法,但老师平时讲,子类构造方法默认第一句有super方法会调用父类构造方法,也就是说子类在调用完父类构造方法SUPER之后,会从构造方法里面跳出来去初始化子类的成员变量,再去执行子类构造方法,这就很尴尬了,这完全违背我们的常识,为了好理解我直接上图了

这就很尴尬了,引用Think in java的话

虽然说我也看不太明白,但还是这样记住吧,然后就是网上一道面试题可以看看,了解一下
父类 static 块 1  执行
父类 静态成员staticSam1初始化
父类 静态成员staticSam2初始化
父类 static 块 2  执行
                        --------父类静态成员初始化
子类 静态成员staticSamSub初始化
子类 静态成员staticSamSub1初始化
子类 static 块  执行
                        -------子类静态成员初始化
父类 sam1成员初始化
父类 sam2成员初始化
父类 Test默认构造函数被调用      
                        -------父类普通成员初始化和构造函数执行
子类 sam1成员初始化
子类 sam2成员初始化
子类 TestSub 默认构造函数被调用
                        -------子类普通成员初始化和构造函数执行


由此得出Java初始化顺序结论:
1 继承体系的所有静态成员初始化(先父类,后子类)
2 父类初始化完成(普通成员的初始化-->构造函数的调用)
3 子类初始化(普通成员-->构造函数)


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马