跳到主要内容

java父类强制转换为子类

· 阅读需 3 分钟
Hanasaki

许多同学在学习到Java的继承时,遇到了父类和子类互相转化的问题,在此通俗的讲一下。

示例一

父类强制转子类

Father f = new Father();
Son s = (Son)f;//出错 ClassCastException

分析:

创建一个父类的实例,想要强制把父类对象转换成子类的,不行! 通俗的想,父亲永远不可能转换成儿子。因为有空白,假如转换了,那么上幼儿园、哺乳,这些儿子的特有属性父亲是没有的,强转就出现了ClassCastException

示例二

“假的”父类强制转子类

Father f = new Son();
Son s = (Son)f;//可以

分析:

父类对象引用着一个子类实例。 Son类特有的属性暂时不能通过 f 来操作,因为Father类没有Son类(子类)的特有属性。 接着创建子类对象 s,它引用的是父类对象 f 强制转换来的对象(其实就是个装爹的Son,把他强制转回了Son),这时就可以通过 s 来操作子类的特有属性了。

通俗的说就是儿子装爹,终究是儿子,本质没变,还是可以把他强制转回儿子的。

示例三

子类强制转父类

Son s = new Son();
Father f = (Father)s;//可以

分析:

子类转换成父类,只是子类对象的特有属性无法利用 f 操作,f 可以操作其非特有的属性(由父类继承而来的属性)。也就是说,儿子可以执行吃饭和睡觉的方法,父亲也有,因为这就是从父亲继承的,但是让父亲执行上小学的方法就不行,因为这是儿子的‘‘特有属性’’。

通俗的说,儿子和爹的共同点——“都是人”,儿子作为人的基本属性是从父亲继承过来的,儿子转换成了父亲,只是失去了原本自己比父亲多出来的那些特有属性。