java对象类型转换导致对象类类型改变的疑问

再写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 返回的是一个实例的本质是什么 父类变量只是个壳而已 如果你搞清楚 子类实例 和 父类实例在内存上的关联 这个问题就很好理解了

子类的对象指向父类型