再写java继承的练习时,我写了一个Employee类,然后再写了一Manger类继承Employee类。主程序写了如下代码:
Manger boss = new Manger();
Employee employee = new Employee();
System.out.println(employee.getClass());
employee = boss;
System.out.println(employee.getClass());
执行结果如图:
我的疑惑在于:为什么employee的类类型在执行了employee = boss后改变了。
楼主的疑惑,实际上是把getClass()方法特殊化了 。
说白了,getClass也不过是个重载的方法:父类employ中有一个getClass方法,输出employ,子类manager中重写了父类的getClass方法,
输出manager.
而强制转换,可以看做是新建一个父类对象,然后把子类重写的方法覆盖该对象的方法。 这样执行的时候就是使用的子类的方法。
当然,在JVM中不会新建一个父类对象,而是会用父类去编译方法是否能够被父类的发放执行,执行的时候还是内存中的子类对象在执行!
这个赋值过后,实际上employee的class 发生了变化。现在employee可以调用子类对象方法,
这个赋值语句应该是向上转型了吧,等同于Employer employer = new Manager();
既然是向上转型了,子类复写了父类的方法,实现的自然就是子类的了
Manger类继承Employee类,继承是“is A”的关系,即------子类就是父类[类型],子类可强转成父类类型。
employee = boss;//这里的赋值,实质就是做类型转化,子类强转成父类类型
真正运行时的类型是子类类型了,这也是Java面向对象的特征之一,编译时的类型和运行时的真正类型可能不是同一种。
getClass 返回的是一个实例的本质是什么 父类变量只是个壳而已 如果你搞清楚 子类实例 和 父类实例在内存上的关联 这个问题就很好理解了
子类的对象指向父类型