父类对象和子类对象之间可以相互转换吗

可以相互转换。但是若父类对象想转换为子类对象,父类对象一定是用子类对象初始化的。

那么父类对象如何用子类对象初始化呢?

假设父类为A,子类为B,那么用子类初始化代码为:

A a=new B()

这就相当于我们用父类的句柄指向了子类的空间,如下图所示:

 此时我们若将a强制转换为子类对象:

B b=(B)a;//相当于B a=new B()

 相当于用子类句柄指向了子类对象空间,因此只是换了个句柄而已!

然而,假如我们的父类未用子类对象初始化:

A a=new A()

 

这样如果我们要强转为子类句柄指向子类对象空间,不仅要更换句柄,空间也要重新分配,各种变量也要重新初始化,开销很大,编译器不会允许通过的。

而若是子类对象转父类对象,只需更换句柄使父类句柄指向子类对象空间即可。

注意:实际是父类句柄指向子类对象空间,所以使用的属性和方法都是子类对象所有的。而因为是父类的句柄指向的只能是父类所拥有的属性和方法,所以指向的属性和方法实则又必须是是从父类继承而来的。

猜你喜欢

转载自blog.csdn.net/qq_36470686/article/details/83385545