难度
初级
学习时间
30分钟
适合人群
零基础
开发语言
Java
开发环境
- JDK v11
- IntelliJ IDEA v2018.3
提示
本教学属于系列教学,内容具有连贯性,本章使用到的内容之前教学中都有详细讲解。
1.对象的初始化顺序
之前我们学习过对象的初始化过程,没看过的同学可以点击下面文章链接看看:
2.继承中的初始化顺序
演示:
继承中的初始化顺序。
代码:
People类:
Student类:
结果:
看看和你的答案是否一致,不一致在哪里?
3.分析初始化顺序
结合上节的案例,我们来看看,继承中初始化顺序是怎么样的。
首先,编译器找到Student类:
发现Student类继承自People类,于是编译器继续加载People类,它会先把父类加载完。类加载之后开始初始化static字段:
于是呢,numberOfPeople类变量被初始化,调用getNumber方法,传入“People numberOfPeople初始化”参数,然后getNumber方法开始执行,显示输出“People numberOfPeople初始化”,返回99。
好了,People加载完毕,接着开始接着初始化Student里面的static字段:
于是呢,numberOfStudent类变量被初始化,调用getNumber方法,传入“Student numberOfStudent初始化”参数,然后getNumber方法开始执行,显示输出“Student numberOfStudent初始化”,返回99。
紧接着,执行程序入口方法:
显示输出“run”:
然后创建Student对象,student对象里面的所有实例变量都被设置为默认值。再接着,由于Student类是继承People类的,所以People的构造方法会被调用(super方法):
People类里面的实例变量也会被先初始化为默认值,再赋予初始化值。
紧接着执行显示输出语句:
显示输出id和name,后面就是给id赋予新值:
在父类People构造方法执行完毕之后,再来初始化Student里面的实例变量:
id第一初始化时被设置为默认值0,然后再来进行初始化,调用getNumber方法,传入“Student id初始化”参数,然后getNumber方法开始执行,显示输出“Student id初始化”,返回99:
当Student类中所有实例变量初始化完毕之后,接着执行Student构造方法:
显示输出id和name:
整个初始化过程就完成了。
总结
- 类在加载过程中,当发现有继承父类时,会加载去父类。
- 类被加载后,首先类变量被初始化,再者静态初始化块被执行。
- 继承中,子类构造方法优先调用父类构造方法,父类中实例变量先初始化,然后执行实例初始化块,最后构造方法执行完毕。父类构造方法执行完毕之后,子类开始进行初始化。
至此,Java中继承与初始化相关内容讲解先告一段落,更多内容请持续关注。
答疑
如果大家有问题或想了解更多前沿技术,请在下方留言或评论,我会为大家解答。
上一章
下一章
“全栈2019”Java第五十三章:向上转型和向下转型详解
学习小组
加入同步学习小组,共同交流与进步。
- 方式一:关注头条号Gorhaf,私信“Java学习小组”。
- 方式二:关注公众号Gorhaf,回复“Java学习小组”。
全栈工程师学习计划
关注我们,加入“全栈工程师学习计划”。
版权声明
原创不易,未经允许不得转载!