package com.dd;public class ExtendsTest { public static void main(String[] args) {
A a = new A();
B b = (B)a;
b.func1();
b.func2();
}
}class A {
public void func1(){
System.out.println("ddd");
}
}
class B extends A {
public void func2(){
System.out.println("eeee");
}
}这个程序我要的结果是: ddd
                    eeee但总报错,Exception in thread "main" java.lang.ClassCastException: com.dd.A
at com.dd.ExtendsTest.main(ExtendsTest.java:7)是什么原因?望高手解答。谢谢!

解决方案 »

  1.   

    B b = (B)a; 
    这句有错误a是父类对象的引用,他是不能强制转换为B类的类型,因为B类是A类的子类
      

  2.   

    A a = new A();
    B b = (B)a; 
    这样导致类型转换错误,比如一个动物类,一个dog类,动物有很多子类,怎么就知道一定是dog呢
      

  3.   

    直接B b = new B();
    然后b.func1(); 
        b.func2(); 
    就打印出两句了
      

  4.   

    B是从A继承下来的,已经包含了func1这个函数,不用再想着去把a的值赋给b来得到func1这个函数,你就写成B b=new B();然后运行就能得到你要的结果,我运行过了~
      

  5.   

    .ClassCastExceptionpublic static void main(String[] args) { 
    A a = new B(); 
    a.func1(); 
    a.func2(); 


      

  6.   

    package com.dd;public class ExtendsTest {public static void main(String[] args) {
    A b = new B();b.func1();
    b.func2();
    }
    }class A {
    public void func1(){
    System.out.println("ddd");
    }
    }
    class B extends A {
    public void func2(){
    System.out.println("eeee");
    }
    } 向上塑形,不要向下塑型
      

  7.   

    A a = new B(); 
    这样写没有问题,典型的多态
    B b = new B(); 
    这样写也没有问题,正常写法
    A a = new A(); 
    B b = (B)a;
    可是为什么要这样写哪?觉得没什么必要
      

  8.   

    类弄转换出错.
    因为A a = new A(); 
    这时候的a引用是一个A类的对象,并不是它的子类B的对像啊.
    如果是
    A a = new B(); 
    再B b = (B)a;这才是对的,因为a实际引用的是一个B的对像.你还可以这样子.
    Object o = new B();
    B b = (B)o;
    因为这个o实际引用的是一个new B();对象.
    为什么
    Object o = new B();这个可以,那就是因为Object是所有类的超类了
      

  9.   

    A a = new B();没问题?你自己写一下试试  a.func2()能执行?
      

  10.   

    B b=new B();
    b.func1();
    b.func2();
    就可以了不用upcasting也不用downcastiong。
      

  11.   

    不对。
    事实上A b = new B();那b只能看见fun1(),看不见fun2();
    LZ是不是不理解继承的意思呢。A,B类没有重写方法。B类继承A类非私有的东西。
    直接创建子类的对象,2个方法都可访问。
    public class ExtendsTest {public static void main(String[] args) {
    B b = new B();
    //B b = (B)a;
    b.func1();
    b.func2();
    }
    }class A {
    public void func1(){
    System.out.println("ddd");
    }
    }
    class B extends A {
    public void func2(){
    System.out.println("eeee");
    }
    }
      

  12.   

    A a = new B()本身不存在任何问题。但这里并不存在父类与子类方法重写,因此A a = new B();在这里起不到任何动态加载的价值,A a = new B();
    a.func1();也不会像有的人像的那样,会动态调用B类的方法func2()输出eeee;Lz 直接这样用就是了B b = new B();//用不着再创建一个A类对象了                    b.func1();//B类继承了A类 A类中的方法当然能够用
                     b.func2();//B类同时扩展了A类 增加了一个方法func2();
    func1()和func2()屁关系都没有。这样写你会不会好理解多了呢
    class A { 
    public void func1(){ 
       System.out.println("ddd"); 


    class B { 
      public void func1(){ 
          System.out.println("ddd"); 
      }
      public void func2(){ 
          System.out.println("eeee"); 
      } 
      

  13.   

    只能将子类转化成父类,不能将父类转化成子类
    转化也只是类型的转化,对象还是那个对象,不会因为转化而使对象本身改变
    JAVA资料太多?选中想收藏的文字(图片),右键选“收录到易载”,搞定!
      

  14.   

    在多态的运用中如果出现需要强制转化的地方,建议LZ先进行判断if(a instanceof B){
    B b = (B)a;
    }或者if(a.getClass()==B.class){
    B b = (B)a;
    }这样可以避免一些非法转换。
      

  15.   

    A a = new A(); 
    B b = new B();
    这样写对你有啥损失呀