前提:B类是A类的子类。
B[] b = new B[2];
A[] a = b;
a[0] = new A();
现在通过b[0]调用B类中特有的方法 就会发生错误问题:
a[0]引用的改变为什么会改变b[0]的引用?
像 B bb = new B();
   A aa = bb;
   aa = new A();
   此时的aa引用 又不会改变bb的引用?

解决方案 »

  1.   

    不用调b[0],
    这种做法
    A[] a = b;
    a[0] = new A();
    本身就会发生错误了吧 ArrayStoreException,有可以正常运行的程序吗?
      

  2.   

    就是啊
    a[0] = new A();咋可能不过如果不管这个错误观看你的问题
    我觉得可以这样理解
    数组也是对象,所以也要看是对对象的操作还是对引用的操作
    a[0] = new A();实际是对a引用所指向的对象的操作,所以它会影响到b所指向的同一个对象
     public static void main(String args[]) {
         B[] b = new B[2];
         A[] a  = b;
         a = new B[10];    
         System.out.println(a.length);
         System.out.println(b.length);
         a[0] = new B();
         b[0].someMethod();    
        }
    这样的话a = new B[10];就是对引用的操作,所以在之后可以看到a和b的长度是不一样的,而对a中对象的操作也不再影响到b中的对象
      

  3.   

    是的饿,a[0] = new A();就不对了
      

  4.   

    首先这里存在向上转型和向下转型,还有内存分配方面的知识。
    第一:执行这句话B[] b = new B[2];在堆内存分配B[2]对象实例,栈内存b指向B[2],
    第二:执行这句话A[] a = b;是把指向B[2]的引用赋值给a,此时a,b同时指向B[2]也就是对B[2]当中的元素的改变会影响a,b
    第三:执行a[0] = new A()把a[0]元素实例化,但是a存储元素的类型实际上是B类型,所以在编译的情况下会抛出异常!当然你想调用B类中的方法肯定不执行。
    至于lz说的a[0]引用的改变为什么会改变b[0]的引用这个问题在执行a[0] = new A()这句话时,实际上a[0]和b[0]指向同一个内存对象new A()(假设执行没有问题的时候)当然会改变b[0]的引用。
    第四:B bb = new B();
      A aa = bb;
      aa = new A();
    这里跟上面有点区别了,虽然执行B bb = new B();
      A aa = bb;
    这两句话之后,aa,bb指向同一个内存对象new B();
    最后一句话aa = new A();
    相当于给aa,重新分配了引用,指向另外一个内存地址,而bb还是指向原来内存地址总的来说数组对象内存分配和对象分配是偶区别的!
    个人理解!