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

我想问一下,为什么向上转型会成功?而向下转型不成功.请各位说一下其中的原理,谢谢了.
class   A
{
void   jj(B   b)
{
System.out.println( "success ");
}
public   static   void   main(String   args[])
{
A   a=new   A();
B   b=new   B();
a.jj(a);//向下转型.失败!,我想问一下,为什么向上转型会成功?而向下转型不成功.请各位说一下其中的原理,谢谢了.
}
}
class   B   extends   A
{

}

------解决方案--------------------
第一个问题
A为B的父类,不可以这么直接用的,
即使在这里a.jj(a);//
强制进行转换a.jj(B(a))也不行
打个比方说,动物类是哺乳动物类的父类,
你不可以说动物都是哺乳动物,所以不可以把一个动物强制转换成哺乳动物,
除非你一开始就知道它是哺乳动物
------解决方案--------------------
第二个问题记不清楚了
好像是因为x是虽然是B类的实例,但它使用的是A类的引用
------解决方案--------------------
可以强制转型:(B)x
不过向下比较危险,不建议使用
------解决方案--------------------
第二个问题中B的age没有访问修饰符,默认是包内可访问的,A和B你是写在一个文件,所以是同一个包,但问题是B是A的子类,A在B出生前就出生了,A怎么会知道B里面有什么呢?main方法在A里面,同样就不知道了,你把main方法调到B里,应该就可以了。