练习继承模块的代码时,编译时各种报错,诸如找不到成员变量等等,最终发现是因为不熟悉父子类加载过程,特别是构造方法/成员变量/静态成员变量/成员方法等元素加载的先后顺序,所以很有必要再总结一下加载过程,如下所示:
- 运行main--->测试类中的main方法中创建子类对象new子类对象--->注意:子类对象真正处于运行期间,执行new 子类对象的时候, 才会将子类对应的字节码文件加载到内存中
- 父类字节码文件加载到内存---> 加载父类中静态内容(变量、方法、静态代码块)【按代码从上往下顺序】
- 子类字节码文件加载到内存---> 加载子类中静态内容(变量、方法、静态代码块)【按代码从上往下顺序】
- 默认初始化父类变量--->给父类变量赋默认的初始化值
- 默认初始化子类变量--->给子类变量赋默认的初始化值
- 加载非静态父类成员方法--->因为只是加载到内存中,所以也可能是在默认初始化之前执行
- 加载非静态子类成员方法--->因为只是加载到内存中,所以也可能是在默认初始化之前执行
- 显示初始化父类成员(非静态变量、构造代码块)---->【按代码从上往下顺序】
- 父类构造---->执行父类中的构造方法
- 显示初始化子类成员(非静态变量、构造代码块)---->【按代码从上往下顺序】
- 子类构造--->执行子类中的构造方法
- 运行main中new对象后的语句--->程序结束
记好这12步,掌握java运行 的原理,能轻松应付各种面试笔试题,并且为学习后面更复杂的做好理论知识储备。
|
|