日期:2014-05-20  浏览次数:20926 次

Java中的多态向下转型问题
class leiBuLeiTest{
public static void main(String[] args){
uio u=(uio)new leiBuLeiTest();//报ClassCastException异常,怎样写才可以既调用父类的a()和自己的b()
u.a();
  u.b();
}
void a(){
System.out.println("aaa");
}
}
class uio extends leiBuLeiTest{
void b(){
System.out.println("bbb");
}
}

------解决方案--------------------
java里,创建的什么类型,才可以强转为什么类型。
正常的多态的用法是:
leiBuLeiTest lblt=new uio(); //声明的父类类型,创建的是子类类型。

这时对象lblt只能使用父类的属性和方法,(如果父类的方法被子类重写,则执行的是子类的方法)。
b()方法没有在父类定义,所以不能直接调用,即lblt.b()会报错。
如果想调用子类的b方法,这时做向下转型即可。(uio)lblt.b()就可以了。

刘洪旺老师有过几句话,我自己觉得对理解多态比较有帮助,可以参考一下:

声明父类,创建子类;
声明的是什么,就拥有什么;
创建的什么,就执行什么;
创建的什么,可以强转为什么;

------解决方案--------------------
LZ你要记住的是,对象向下转型是一件很危险的事情,为什么我觉得LZ你应该知道,
子类要是新有的属性,而父类转型,不危险么,是吧!
LZ可以直接向上如果只是想调用父类的属性,有步骤:
1.创建子类对象
2.通过super关键字引用父类的非私有属性。
class leiBuLeiTest{
public static void main(String[] args){
new uio().b(); //new子类并调用自己的b方法
}
void a(){
System.out.println("aaa");
}
}
class uio extends leiBuLeiTest{
void b(){
super.a(); //用super关键字
System.out.println("bbb");
}
}
/*
运行结果:

aaa
bbb

*/