本帖最后由 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 子类初始化(普通成员-->构造函数)
|