关于数组存放错误类型,编译通过,但是抛出ArrayStoreException的问题

 

我们有一个父类Aninal ,子类Dog

情况1:多个数组引用指向同一个内存地址

Dog[] dogs = new Dog[10];

Dog[] dogs2= dogs;

然后我们创建一个Dog对象 放入数组

Dogs2[0] = new Dog();

dubug运行发现:

1、两个数组刚开始都是所有元素为null,当dog对象放入dogs2数组时,dogs2数组第一个位置有了对象,同时,dogs第一个位置也有了对象?

仔细想想,其实不奇怪,因为2个数组指向的是同一个内存地址,虽然我操作的是dogs2,但是别忘了,这个dogs2包括dogs,仅仅是一个数组对象的引用,名称不一样,但是引用地址是一样的(即第一次创建dogs时分配的内存地址),也就说,无论改变哪一个,都实际上是改变了dogs创建时分配的内存地址上的数据。如果非要这样操作,那么改为这样:Dog[] dogs2 = dogs.clone()

就不会相互影响了

情况2:

我们有一个父类Aninal ,子类Dog

Dog[] dogs = new Dog[10];

由于Dog 继承Animal,所以所有的Dog数组元素也肯定都是Animal ,下面这样写:

Animal[] animals = dogs;//注意:这里编译竟然可以通过

然后我们创建一个Anmal对象 放入数组

animals[0] = new Animal();

这里运行的时候,将会抛出异常ArrayStoreExcetion ,异常类我们点进去通过注释了解到,

关于数组存放错误类型,编译通过,但是抛出ArrayStoreException的问题

很明显,这样写,即使编译器运行,但是实际操作时,会造成该内存地址上的数组出现问题。是不可取的。不要纠结为什么编译器不报错,要想避免出现这样的情况,在使用数组时,要严谨的控制存入的数组类型,保持跟数组实际的类型一致