发布网友 发布时间:2022-05-29 03:05
共1个回答
热心网友 时间:2024-12-11 21:49
向下转型 将超类的引用强制转换为子类类型就叫做向下转型。 注意:将超类的引用赋给为子类类型的变量(没有进行显示地强制转换)是一个编译 错误。 例子: 还是上面的for循环代码 for(int i=0;i<x.length;i++) { if(x[i] instanceof MoreUseful2) // 判断instanceof左边的对象是否是右边的类的实例。 { MoreUseful2 moreuseful2 = (MoreUseful2)x[i]; // 向下转型 moreuseful2.u(); } x[i].g(); } 分析:x[i]可以代表具体的Useful对象类型,当它是MoreUseful2或ExtendsMoreUseful2 对象类型时,就可以调用该对象的额外方法u(),v(),w(),也就是当对象x[i]和Moreusful对 象存在is-a关系时,才可以进行向下转型,如果要转换的对象类型与指定的对象类型不 存在is-a关系时,会产生一个ClassCastException异常。 总之: 向下转型时,对象只能强制转换为其本身类型或者其超类类型。比如, 当x[i]ExtendsMoreUseful2对象时,可以把他转换为其本身ExtendsMoreUseful2对象类 型,也可以把它转换为其基类MoreUseful2类型。但是在编译时候还不知道这个x[i]是代 表那个具体对象类型只知道这个x[i]是基类类型引用,所以要用这样的形式" (想要要得 到的类型)x[i] " 进行转换。x[i]在这里是就我这个例子来说明的,你也可以使用其它的 英文代替,其意义是一切符合规定的需要被转换的对象。 下面还有个关于向上转型和向下转型的例子, abstract class ClassAbstract1{} class ClassDerived1 extends ClassAbstract1 { public void play1() { System.out.println("play1() is in the ClassDerived1"); } } abstract class ClassAbstract2{public abstract void play2();} class ClassDerived2 extends ClassAbstract2 { public void play2() { System.out.println("play2() is in the ClassDerived2"); } } public class E14_UnCast { public static void playDemo1(ClassAbstract1 ObjectParameter) { ((ClassDerived1)ObjectParameter).play1();//向下转型,可以调用导出类中的扩展方法 } public static void playDemo2(ClassAbstract2 ObjectParameter) { ObjectParameter.play2();//向上转型,可以调用导出类中的覆盖方法 } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub ClassAbstract1 classabstract = new ClassDerived1(); playDemo1(classabstract); ClassAbstract2 classabstract2 = new ClassDerived2(); playDemo2(classabstract2); } } 运行结果: play1() is in the ClassDerived1 play2() is in the ClassDerived2