public class test{
public static void main(String [] args){
c1 _c1 = new c1();
c2 _c2 = (c2)_c1;
_c2.p1();
_c2.p2();
}
}
class c1{
public void p1(){System.out.println("haha");}
}
class c2 extends c1{
public void p2(){System.out.println("hehe");}
}报Exception in thread "main" java.lang.ClassCastException: c1
        at test.main(test.java:4)

解决方案 »

  1.   

    c1 _c1 = new c1();
    c2 _c2 = (c2)_c1;
    _c2.p1();
    _c2.p2();
    你这个明显不对嘛,子类对象的引用可以向上转型为父类的引用;但是在父类引用向下转为子类引用的转型,必须满足引用指向的对象本身就是一个子类对象才行!
    而在你这个程序中,对象本身是一个父类对象,所以向下转型会失败,因为它根本就不是一个子类c2的对象;更别说调用c2中的方法p2了
      

  2.   

    lz,如果父类对象引用指向的实际是一个子类对象,那么这个父类对象的引用可以用强制转换成子类对象的引用!
    所以你的第三行应该改为:c1 _c1=new c2();
    这样第四行才是正确的!
    另外类对象不要写成_c1,_c2的形式!这样写不符合规范的!
    我相信你应该满意了吧,满意的话就给分!
      

  3.   

    当应用程序代码尝试将某一对象[_c1]转换为某一子类[c2]时,如果该对象[_c1]并非该子类[c2]的实例,JVM 就会抛出 ClassCastException。想知道更多? 请参看: http://blog.java-cn.com/user1/2028/archives/2005/12303.html
      

  4.   

    刚才想到一个问题,自问自答了: --------"在父类引用向下转为子类引用的转型,必须满足引用指向的对象本身就是一个子类对象才行!" 如果引用指向的对象已经是一个子类对象了,那还要转换干什么?--------因为指向的对象并不一定被声明为他本来的类,比如在ArrayList里的元素. 比如一个类被转换成了父类,要再转回去
      

  5.   

    恩,success_dream(sharp engineer) 说的对1!!
      

  6.   

    c2 extends c1
    c1  obj_c1=new c2();
    c2 obj_c2=(c1)obj_c1;
    这样就可以了。