继承关系中子类与父类加载与初始化
来源:互联网 发布:linux lamp一键安装 编辑:程序博客网 时间:2024/04/28 16:54
前面一篇文章说了类初始化的过程,本篇说说继承关系中类的加载与初始化。
首先抛出一个问题,Student s = new Student();总共做了哪些事?
1、加载Student.class文件进内存,
2、如果Student有父类,则递归加载父类class文件并进行初始化;注意Student实现接口并不会加载和初始化。
3、初始化Student该类,初始化过程参考之前文章讲解。
4、父类递归进行成员变量的默认初始值设置。
5、Student进行成员变量默认初始值设置。(现在博主不知道这个动作是JAVA虚拟机做的还是在编译器自动添加的)
6、递归进行对父类成员变量进行显示初始值设置包括代码块。
7、对Student进行成员变量显示初始值设置包括代码块。
8、递归调用父类的构造方法。注意:这里是因为java编译器在Student的所有构造器里面必须强制显示或者隐示调用父类某一个构造器,这是JAVA的特性,即希望在构造器完成必要的初始值设置,同时子类需要使用父类的值时可以调用。
9、Student调用构造方法对学生对象的成员变量赋值。
10、学生对象初始化完毕,把对象地址赋值给s变量。
以下介绍一个例子:
public class PloyConstructors { public static void main(String[] args) { new RoundGlayph(5); }}class Glyph{ void draw(){ System.out.println("Glyph().draw"); } Glyph(){ draw(); } { System.out.println("Glyph"); }}class RoundGlayph extends Glyph{ private int i = 1; private String a ; { System.out.println("RoundGlayph"); } RoundGlayph(int r){ a = "123"; System.out.println("before RoundGlayph(),i="+i); i = r; System.out.println("after RoundGlayph(),i="+i); } void draw() { System.out.println("RoundGlayph().drwa(),i="+i);//System.out.println("RoundGlayph().drwa(),i="+i+a.toString()); //这样a还没有初始化,报空指针 }}
为什么调用a.toString()会报错相信我们应该懂了,但是现实中如果解决这个事情呢,TIJ一书说到,最好是不要这样做,即父类不要调用子类重写的方法,如果你真要这样做的话,就可以在使用时判断是否初始化。
阅读全文
0 0
- 继承关系中子类与父类加载与初始化
- Java继承中子类与父类的关系
- 父类与子类、继承关系总结
- 父类与子类、继承关系
- 继承关系中,子类父类的初始化顺序
- python 类继承与子类实例初始化
- python 类继承与子类实例初始化
- Java 继承 父类变量, 方法 与子类的关系:
- 继承(子类与父类构造函数的关系)
- 继承 父类与子类
- JAVA中子类与父类对象的初始化顺序
- Java子类初始化与基类的关系
- JAVA final 、super 关键字以及继承关系中父类与子类实例变量初始化的 理解
- C#子类与父类的初始化
- 子类与父类的初始化
- 子类与父类的初始化问题
- Java子类与父类的初始化
- 子类与父类的初始化
- js中深拷贝与浅拷贝的区别
- Android源码分析--Handler和Looper机制详解
- 我的博客即将入驻“云栖社区”,诚邀技术同仁一同入驻。
- 可重入锁 -- ReentrantLock
- 【C++错误处理】no matching function for call to transform
- 继承关系中子类与父类加载与初始化
- 回顾大一·C语言编程4.1(1)
- 如何通过dba_hist_active_sess_history分析数据库历史性能问题
- 编码规范
- CS R20 C(贪心+二分) D(套路(n后第k个合法数)二分+数位DP.) E(好题:回文,字符串哈希)
- 一起来学SpringCloud之
- ajax读取本地json文件
- C++对结构体元素排序
- 计算机网络基础知识总结