对哦,b数组本来是B对象的, a[0] = new A();后你给它赋值了个A对象你只能赋值B对象或B对象的子类,不能给个父类啊
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(); } }
会报ArrayStoreException,原因都知道是将父类对象赋值给了子类的对象数组。a和b指向同一个数组。 a[0]和b[0]是同一个,都存储的是对象的地址,a[0] = new A()时a[0]值改变了b[0]也是同一个元素,自然也改变了。
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 {}
B[] b = new B[3]; //开辟存放三个子类元素的数组内存空间 A[] a = b; //a指向上面开辟的内存空间,这里要啰嗦一下,这里的a内部的三个元素必须要存放子类对象(也就是B),或者继承了子类的对象 a[0] = new A(); //你这里恰好违反了上面第二条,也就是数组元素存放了父类的对象总之一句话,父类引用能指向子类实例(就像接口指向接口的实现(List与ArrayList)),子类引用不能指向父类实例
我不知道这样想又对不对,是否是数组不允许它的元素类型不相同呢? 就像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 { }
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类型的对象,那这不是企图要改变数组的大小码
a[0]和b[0]是同一个,都存储的是对象的地址,a[0] = new A()时a[0]值改变了b[0]也是同一个元素,自然也改变了。
{
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
{}
A[] a = b; //a指向上面开辟的内存空间,这里要啰嗦一下,这里的a内部的三个元素必须要存放子类对象(也就是B),或者继承了子类的对象
a[0] = new A(); //你这里恰好违反了上面第二条,也就是数组元素存放了父类的对象总之一句话,父类引用能指向子类实例(就像接口指向接口的实现(List与ArrayList)),子类引用不能指向父类实例
就像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 {
}