JAVA的对象和引用——一个真实遇到的问题

最近在写一段代码的时候,不懂JAVA的我被困住了。先简单描述一下要实现的效果:我要往secretVector里塞28个byteVector,这28个byteVector分别装着10个数值,而且这28个byteVector互不相同。

public static Vector reformChildSecret(Vector fileVector){
Vector secretVector= new Vector();
Vector byteVector= new Vector();
for(int i= 0; i< 28; i++){
          byteVector.removeAllElements(); //关键看这里
for(int j= 0; j< 10; j++){
byteVector.add(j, ((Vector)(fileVector.get(j))).get(i)); //关键看这里
}
secretVector.add(byteVector); //关键看这里
}
System.out.println(secretVector.size());
return secretVector;
}

那这段代码究竟能不能实现呢?不能!

原因很简单:byteVector是一个对象引用,这个对象引用由始至终 只指向同一个Vector类的对象。JAVA有一个特点就是:不能直接操作对象,而是要通过对象引用来操作对象

用这个原因来分析代码:

1、每次把byteVector引用指向的对象内容清空;

2、然后又往byteVector引用指向的对象里塞入10个数值;

3、塞完后,把byteVector引用添加到secretVector引用指向的对象中;

但问题在于,secretVector引用指向的对象装着的只是byteVector引用(而且装的都是同一个byteVector引用),而不是byteVector引用指向的对象的内容。而byteVector引用所指向的内容每次循环中都会发生变化,所以到最后,secretVector的每个元素的内容都是一样的,因为每个元素都是同一个byteVector引用,并且byteVector引用的内容最终会是最后一次add()的数值。

另外,有一篇博文把Java对象和引用讲得挺清楚的,如果Java基础薄弱的可以看一下。博文地址:

http://www.cnblogs.com/focusChen/articles/2497768.html

上一篇:Redis缓存穿透、缓存雪崩和缓存击穿理解


下一篇:定制NOTA-PLGA/NOTA-PCL聚已内酯/NOTA-PLA 聚乳酸/NOTA-PAA聚丙烯酸/NOTA-PEI聚乙烯亚胺/NOTA-PAMAM树枝状聚酰胺系列聚合物标记的NOTA衍生物