这段代码有问题吗
--------------------编程问答-------------------- 有问题,b[0]和a[0]引用的是同一个对象, a[0] = new A();会让b[0]指向父类对象。要出错的 --------------------编程问答-------------------- 我怎么觉得没问题啊! --------------------编程问答--------------------
public class Test
{
public static void main(String[] args)
{
B[] b = new B[3];
A[] a = b;
a[0] = new A();
}
}
class A
{
}
class B extends A
{
}
小白,你在干什么 --------------------编程问答-------------------- 睡午觉 --------------------编程问答--------------------
有问题,b[0]和a[0]引用的是同一个对象, a[0] = new A();会让b[0]指向父类对象。要出错的
a[0]和b[0]是两个不同的变量,引用同一个对象,现在让a[0]指向另一个对象,关b[0]什么事? --------------------编程问答-------------------- 有问题 编译不报错 运行会报错,b[0]和a[0]引用的是同一个对象 --------------------编程问答-------------------- a[0]和b[0]存的地址啊,指向同一片内存空间 --------------------编程问答--------------------
a[0]和b[0]存的地址啊,指向同一片内存空间
我知道【a[0]和b[0]存的地址啊,指向同一片内存空间】,a[0]和b[0]是两个不同的变量,在内存中的地址不同,我现在让a[0]中存入另一个对象的地址,b[0]中存的还是原来对象的地址啊 --------------------编程问答-------------------- 编译没问题,运行出错了,儿子的引用指向父亲的对象了 --------------------编程问答-------------------- ArrayStoreException,就是地址引起的 --------------------编程问答-------------------- 画图你就知道了,a和b指向的是同一个数组,a[0]的值变了难道b[0]的值不应该变吗,想不明白就画图 --------------------编程问答-------------------- 对哦,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();
}
}
class A
{
}
class B extends A
{
}
把数组改成普通通变量就不会有错,这是为什么,数组的大小是固定的。
本来人家数组a指向的是B类型的对象,而如今你想要a指向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
{
}
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类型的对象,那这不是企图要改变数组的大小码
数组中存储的都是引用,不存在改变大小一说 --------------------编程问答-------------------- B[] b = new B[3]; //开辟存放三个子类元素的数组内存空间
A[] a = b; //a指向上面开辟的内存空间,这里要啰嗦一下,这里的a内部的三个元素必须要存放子类对象(也就是B),或者继承了子类的对象
a[0] = new A(); //你这里恰好违反了上面第二条,也就是数组元素存放了父类的对象
总之一句话,父类引用能指向子类实例(就像接口指向接口的实现(List与ArrayList)),子类引用不能指向父类实例 --------------------编程问答--------------------
B[] b = new B[3]; //开辟存放三个子类元素的数组内存空间
A[] a = b; //a指向上面开辟的内存空间,这里要啰嗦一下,这里的a内部的三个元素必须要存放子类对象(也就是B),或者继承了子类的对象
a[0] = new A(); //你这里恰好违反了上面第二条,也就是数组元素存放了父类的对象
总之一句话,父类引用能指向子类实例(就像接口指向接口的实现(List与ArrayList)),子类引用不能指向父类实例
大家都没有高清楚我的是什么,我当然知道子类引用不能指向父类对象。这个问题的关键是a[0]与b[0]【操作同一段内存空间】,赋值给a[0]就相当于赋值给b[0]。其实这里用指针数组很好理解,java去除了指针的概念,反而变得不清晰 --------------------编程问答-------------------- 我不知道这样想又对不对,是否是数组不允许它的元素类型不相同呢?
就像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 {
}
我不知道这样想又对不对,是否是数组不允许它的元素类型不相同呢?
就像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 {
}
你这里a又重新分配了数组new A[3]的地址,此时a和b就是两个没什么关系的变量了 a保存的是new A[3]数组的地址,b保存的是new B[3]数组的地址,当然不会报错。 --------------------编程问答--------------------
我不知道这样想又对不对,是否是数组不允许它的元素类型不相同呢?
就像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 {
}
而a[0]=new A();这时a依然指向new B[3]在内存中的地址,此时a和b都指向了new B[3];而new B[3]数组里面的元素只能是B的实例或者继承B的子类的实例,现在你赋值个B的父类A的实例,当然会报错。 --------------------编程问答-------------------- 除
补充:Java , Java SE