A a=new B();
 B b1=(B)a;这个怎么理解啊

解决方案 »

  1.   

     就好比
    List listData = new ArrayList();
    ArrayList d = (ArrayList) listData;
    转型。
      

  2.   

    B继承了A,但是B没有重写A的各个方法,你是想看b1对自身的引用,还是对父类的引用?
      

  3.   

    A a=new B();
     B b1=(B)a;
     b1.fun1();
     b1.fun2();
     b1.fun3();
    比较好的写法是
    A a=new B();
     B b1=(B)a;
     a.fun1();
     a.fun2();
     b1.fun3();
    子类调用从父类继承的方法,利用多态可以直接调用。而fun3是子类自己的方法,使用父类定义的对象是没有办法调用的,所以必须 B b1=(B)a;转换定义类型来进行调用。
      

  4.   

    A a = new B(); // 父类引用指向子类对象
    B b1 = (B) a; // 强制类型转换
    但是你这样写是危险的,因为如果a不是B类的对象而是A类的对象,那么你的程序就会出异常,因为a中压根就没有fun3,强制转换也无法给你的对象多加一个fun3方法,所以出现异常,异常代码如下:
    package csdn;class A {
    public void fun1() {
    System.out.println("A--->小三真好!!");
    } public void fun2() {
    this.fun1();
    } public void fun8() {
    System.out.println("B----->小三再见!!");
    }
    }class B extends A {
    public void fun5() {
    System.out.println("B----->小三你好,小三再见!!");
    } public void fun3() {
    System.out.println("B----->小三再见!!");
    }
    }public class DuotaiDemo1 {
    public static void main(String[] args) {
    A a = new A(); // 父类引用指向子类对象
    B b1 = (B) a; // 强制类型转换
    b1.fun1();
    b1.fun2();
    b1.fun3();
    }
    }
      

  5.   

    你的实例是用A声明的,而B对A进行了扩展,实例化的是B对象。如果想要使用B的独有方法,必须强转成B
      

  6.   

    这是个比较典型的多态的例子,先说 A a=new B(); 这个的理解是,用A的属性和方法去调用B的同名属性和方法。这里你操作的A中的所有属性和方法,都会由B中同名的属性和方法去实现。正如上面的A中有fun1,fun2,fun8,B中有fun3,fun5。因为A中没有fun3,fun5。所以尽管你实例的是B,但是你却不能调用B中的fun3,fun5。B b1=(B)a; 这是强制类型转换,把A类型的a强转为B类型,强转后,就可以调用B中的fun3,fun5了,因为B是继续A的,当然也能调用A中的fun1,fun2,fun8.
      

  7.   

    A a=new B();
     B b1=(B)a;
    这儿的问题。。改成
    A a=new A();
     B b1=(B)a;
    就可以了、
      

  8.   

    A a=new B();是向上转型,这个向上转型都是自动完成的,这样做的目的是不让父类操作子类的特有数据成员
     B b1=(B)a;是向下转型,这个是强制的,目的是为了让父类访问子类的特有数据成员,这两个是相对的