日期:2014-05-20  浏览次数:20620 次

为什么这段代码这样执行,在线等......
Vector   a=new   Vector();
Vector   b=new   Vector();
a.add( "1 ");
a.add( "2 ");
b.add(a);
现在b中:
[1,2]
a.clear();
a.add( "33 ");
a.add( "55 ");
b.add(a);
现在b中结果为
[33,55][33,55]
为什么是这样,二不是
[1,2][33,55]
如何得到
[1,2][33,55]
这样的结果?


------解决方案--------------------
b.add(a);
这里只是引用a,并不是实际值,
所以你清空a后
a.add( "33 ");
a.add( "55 ");
b.add(a);
又引用了一次,所以b中的两次引用实际上是指向的同一个a
------解决方案--------------------
b中存放的是a的引用,a做什么操作都会影响到b~

------解决方案--------------------
在java中对象传送的是地址,而不是对象的值,当你两次b.add(a),其实是对同一个对象的两次操作,两次指向同一个内存地址,在输出值时是输出的同一个对象的值,也就是内存中的同一个物理地址。
------解决方案--------------------
Vector a=new Vector(); 
Vector b=new Vector(); 
a.add("1"); 
a.add("2"); 
b.add(a); 
现在b中: 
[1,2] 
//a.clear(); 
a = new Vector(); //you should new again
a.add("33"); 
a.add("55"); 
b.add(a); 

------解决方案--------------------
jiqimiao 说的对
------解决方案--------------------
正解啊
------解决方案--------------------
其实楼主不妨回头把基础内容再看看
------解决方案--------------------

2要点

1:java基础,对象是以引用传送的
2:看下java.util.Vector.add(Vector)
------解决方案--------------------
1楼
------解决方案--------------------
基础很重要
------解决方案--------------------
1楼正解!

要明白,add(a)之后,实际上是把a引用关联上,对a的修改会影响到b。
------解决方案--------------------
补充一下。

java类型分为基本类型和引用类型,前者分配在栈内存中,后者分配heap堆内存中,前者消耗的资源明显小于后者。

基本类型变量间的赋值方式是值传递,例如:
int a = 10;
int b = a;
b copy了a的一个副本,内容就是10。你针对a或b的修改都不会影响到另一个值:
b = 20;
输出后,a还是10,b是20。

引用型变量间的赋值方式是传递引用,换句话说,就是共享实例,例如:
Class A{
  public int i = 10;
}
public static void main(String args[]) {
  A a = new A();
  A b = a;
}
内存分配是这样的,在栈内存中存在两个引用型对象a和b,它们两个同时指向heap堆内存中包含了int i = 10的对象。如此,a与b便共享一个实例。任何针对a或b的修改都将影响到另一个对象:
a.i = 100;
输出a.i与b.i后,两者都为100。两者指向的那个对象的值i已经被修改为100了。


这里要特别注意的是String类型的对象。它是一个引用类型,但它也是恒定的。
String s = "123";
创建了两个对象(相信在很多面试题中都出现过),一个对象是栈内存中的引用型对象s,它指向heap堆内存中的字符串对象"123"。
你针对s的修改操作:
s += "456";
并没有修改heap堆内存中的字符串对象"123",而是s指向新的字符串对象"123456"。
sun用StringBuffer实现了可修改的字符串对象,是一个char结构的数组。
------解决方案--------------------
java里面都是值传递,b只是引用了a,指向了a里面的内容,所以a变 b 全变
------解决方案--------------------

------解决方案--------------------
集合类存的是引用 。。
------解决方案--------------------
Vector a=new Vector();
Vector b=new Vector();
a.add("1");
a.add("2");
b.add(a);
现在b中: