java父类强制转换为子类

用Dom4j解析xml时,将node强制转换为子类element并成功调用了子类方法,印象中父类是不可调用子类方法的,测试过程中使用了示例一,过程中报 ClassCastException异常,特此记录一下。

示例一(错误示例)

Father f = new Father();
Son s = (Son)f;//出错 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 可以操作其非特有的属性(由父类继承而来的属性)。

通俗的说,儿子和爹的共同点——“都是人”,儿子是人是从父亲继承而来的,他们都有人的基本行为,只是儿子永远不可能和父亲平辈(子类类型转换成父类类型)。

因此,推测element和node之前关系为方式一。
方式一

 //父类接收,具体实现为子类Cat
  public Animal cat() {
        return new Cat();
    }
    Cat cat1 = (Cat) cat();
    cat1.say();

方式二(父类不可向下转型为子类)

//具体实现为父类,不可强转为cat,报错
 public Animal animal() {
        return new Animal();
    }
    Cat cat2 = (Cat) animal();
    cat2.say();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值