java 向下转型报错_java的向下转型问题?

展开全部

首先还是给出解决办e5a48de588b662616964757a686964616f31333433643038法吧:

package d;

import c.F;

public class A extends F

{

public static void main(String[] args)

{

A temp = new A();

F f = (F) temp;

if (f instanceof A)

{

A a = (A) f;

System.out.println(a.a());

}

}

输出结果:

681253fc91910612f3ea848be828e39a.png

你的要求无法实现。因为在你的例子中,f本身并不是由A类型向上转型为F得来的,所以本身是不会带有A的特性的,强制转换为A会失败,因为f在堆中的内容并未包括A类型的特性。即使你强制转换为A,A的新构造函数并不会调用,所有A额外的特性不会在堆中声明,所以会报错。Java中的向下转型是有条件的,你向下转型的对象必须原本在堆中包含了目的类型的内容,也就是说这个对象必须原本就是目的类型或其子类,只不过是通过向上转型现在不是目的类型或其子类罢了(但是堆中还是由该目的类型的特性存在,理解这一点很重要!)

有一个简单的办法验证这一点,就是你向下转型的时候,目的类型的构造函数并不会再一次调用,这样一来也就不会有目的类型的特性了,调用目的类型的特性自然而然就会失败了:

class Parent

{

public Parent()

{

System.out.println("This is Parent");

}

}

public class Child extends Parent

{

public Child()

{

System.out.println("This is Child");

}

public static void print()

{

System.out.println("print()");

}

public static void main(String[] args)

{

Child test1 = new Child();

Parent temp1 = (Parent) test1;

Child target1 = (Child) temp1;

target1.print();

Parent test2 = new Parent();

Child target2 = (Child) test2;

target2.print(); // 报错

}

}

输出结果:

9e72c02c095136cff9b68a5ca9c804c3.png

还有不理解可以追问。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值