当前位置:编程学习 > JAVA >>

这段代码有问题吗



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]指向父类对象。要出错的 --------------------编程问答-------------------- 我怎么觉得没问题啊! --------------------编程问答--------------------
引用 2 楼 YangMeiGui111 的回复:
我怎么觉得没问题啊!


小白,你在干什么 --------------------编程问答--------------------
引用 3 楼 u011935764 的回复:
Quote: 引用 2 楼 YangMeiGui111 的回复:

我怎么觉得没问题啊!


小白,你在干什么
睡午觉 --------------------编程问答--------------------
引用 1 楼 fudongrifdr 的回复:
有问题,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]存的地址啊,指向同一片内存空间 --------------------编程问答--------------------
引用 7 楼 fudongrifdr 的回复:
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
{

}
--------------------编程问答--------------------
引用 13 楼 lg1544650023 的回复:
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)),子类引用不能指向父类实例 --------------------编程问答--------------------
引用 17 楼 u011213572 的回复:
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 {
}
--------------------编程问答--------------------
引用 19 楼 lg1544650023 的回复:
我不知道这样想又对不对,是否是数组不允许它的元素类型不相同呢?
就像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]数组的地址,当然不会报错。 --------------------编程问答--------------------
引用 19 楼 lg1544650023 的回复:
我不知道这样想又对不对,是否是数组不允许它的元素类型不相同呢?
就像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
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,