有问题,b[0]和a[0]引用的是同一个对象, a[0] = new A();会让b[0]指向父类对象。要出错的

解决方案 »

  1.   

    a[0]和b[0]是两个不同的变量,引用同一个对象,现在让a[0]指向另一个对象,关b[0]什么事?
      

  2.   

    我知道【a[0]和b[0]存的地址啊,指向同一片内存空间】,a[0]和b[0]是两个不同的变量,在内存中的地址不同,我现在让a[0]中存入另一个对象的地址,b[0]中存的还是原来对象的地址啊
      

  3.   

    ArrayStoreException,就是地址引起的
      

  4.   

    画图你就知道了,a和b指向的是同一个数组,a[0]的值变了难道b[0]的值不应该变吗,想不明白就画图
      

  5.   

    对哦,b数组本来是B对象的, a[0] = new A();后你给它赋值了个A对象你只能赋值B对象或B对象的子类,不能给个父类啊
      

  6.   

    package anyPackage;
    public class Test 

         public static void main(String[] args) 
         { 
    //           B[] b = new B[3];
    //           A[] a = b; 
    //           a[0] = new A(); 
               B bb = new B(); 
               A aa = bb;
               aa = new A();
         } 

      
    class A 

      

      
    class B extends A 

      

    把数组改成普通通变量就不会有错,这是为什么,数组的大小是固定的。
    本来人家数组a指向的是B类型的对象,而如今你想要a指向A类型的对象,那这不是企图要改变数组的大小码
      

  7.   

    会报ArrayStoreException,原因都知道是将父类对象赋值给了子类的对象数组。a和b指向同一个数组。
    a[0]和b[0]是同一个,都存储的是对象的地址,a[0] = new A()时a[0]值改变了b[0]也是同一个元素,自然也改变了。
      

  8.   

    public class TempTest
    {
         public static void main(String[] args)
         {
               B[] b = new B[3];
               A[] a = b;
               //这里改为new个B就不会报错了
               a[0] = new B();
         }
    }class A
    {}class B extends A
    {}
      

  9.   

    B[] b = new B[3]; //开辟存放三个子类元素的数组内存空间
    A[] a = b;        //a指向上面开辟的内存空间,这里要啰嗦一下,这里的a内部的三个元素必须要存放子类对象(也就是B),或者继承了子类的对象
    a[0] = new A();   //你这里恰好违反了上面第二条,也就是数组元素存放了父类的对象总之一句话,父类引用能指向子类实例(就像接口指向接口的实现(List与ArrayList)),子类引用不能指向父类实例
      

  10.   

    大家都没有高清楚我的是什么,我当然知道子类引用不能指向父类对象。这个问题的关键是a[0]与b[0]【操作同一段内存空间】,赋值给a[0]就相当于赋值给b[0]。其实这里用指针数组很好理解,java去除了指针的概念,反而变得不清晰
      

  11.   

    我不知道这样想又对不对,是否是数组不允许它的元素类型不相同呢?
    就像a[0] = new A()会报错是因为数组a中的第1个元素和第2,3个元素不同而导致了错误。
    但是把数组a的全部元素都实例化成A类型却可以
    package anyPackage;public class Test {
    public static void main(String[] args) {
     B[] b = new B[3];
     A[] a = b;
    //  a[0] = new A();
     a = new A[3];
    }
    }class A {
    }class B extends A {
    }
      

  12.   

    你这里a又重新分配了数组new A[3]的地址,此时a和b就是两个没什么关系的变量了 a保存的是new A[3]数组的地址,b保存的是new B[3]数组的地址,当然不会报错。
      

  13.   

    而a[0]=new A();这时a依然指向new B[3]在内存中的地址,此时a和b都指向了new B[3];而new B[3]数组里面的元素只能是B的实例或者继承B的子类的实例,现在你赋值个B的父类A的实例,当然会报错。