前提: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的引用?
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的引用?
解决方案 »
- HttpURLConnection下载报Server returned HTTP response code: 503 for URL
- 自己写的一个html转text的java程序,能运行但是有异常
- 问个final方法的小问题
- JAVA中随机给数组赋值问题
- 从LinkedList 中取对象的问题??
- 请问aa,Aa,Zb,Wa,cc,如果按照英文字母排序的话顺序是如何的?
- 我在使用DataTable时,在表格中加入<h:commandLink action="bean.editAction">
- 判断Text中的值是否改动的事件有吗? 十分感谢!!
- 如何做QQ?
- 我的JBuilder5每次都提醒我注册,怎么去掉这个提醒,不提醒会死吗?
- Java socket问题
- 编译异常
这种做法
A[] a = b;
a[0] = new A();
本身就会发生错误了吧 ArrayStoreException,有可以正常运行的程序吗?
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中的对象
第一:执行这句话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还是指向原来内存地址总的来说数组对象内存分配和对象分配是偶区别的!
个人理解!