你这实例很不错,我细细研究了下,的出了一个颇有意思的结论
首先 Child extends Parent 在new Child对象的时候 同时会默认去调用父类的无参构造函数
至于这个在父类的this 指针 为什么在new子类的时候 打印出来的class是属于子类的
其实也很好解释 , 对于JVM来说, 你new 的是子类对象 而this指针式代表对象自己,JVM只知道是子类new了对象
所以在父类构造方法中的this 指向的就是子类对象---注意哦 在父类的构造方法中 此时的this指针都是指向的子类对象
至于 会报空指针异常,原因也很简单
子类覆盖了父类的方法,在父类调用该方法的时候,会优先从子类方法中寻找,如果找到了,就执行子类的方法
如果没找到,才会去执行父类的方法,至于原理,我也想了下,应该和ClassLoader的 委托模型脱不了关系- package test.cn;
- class Parent{
- String name= "234";
- public Parent(){
- System.out.println("Parent 构造方法");
- System.out.println(this.getClass());
- info(); //如果new的是子类对象 会优先使用子类的覆盖方法
-
- }
- public void info(){
- name="CC";
- System.out.println("Parent info");
- }
-
- }
- class Child extends Parent{
- public Child(){
- System.out.println("Child 构造方法");
- info();
- }
- public void info(){
- System.out.println("Child -- info");
- name.length();
- }
- }
- public class MainClass{
- public static void main(String[] args){
-
- new Child();
- }
- }
复制代码
|