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

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

 

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

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

A a=new B()

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

 

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

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

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

 

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

A a=new A()

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

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

 

注意:

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

此时使用继承于父类的方法(但是被子类重写),所以使用的是重写的方法。而从父类继承的属性不会被覆盖,所以此时访问到的属性是从父类继承的属性。                                                                                                                                                                                                                                                                                                                                                

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值