问下我遇到的这个问题是什么原因如何解决?

suncs2001 2008-08-18 08:50:42
为什么输出2个值会相同,如何解决这个问题呢.因为这只是个测试,实际程序里我需要保存1个返回的对象,对这个对象需要添加一个结点然后再跟原来的没加结点的那个进行计算比较.结果发现程序有问题,找了半天才发现在添加一个结点后原来那个也自动加了个,我不知道怎么解决这个问题.莫非这里是引用?

import java.util.*;
class A{
Vector a;
A(){
a=new Vector();
}
public void add(int num){
a.add(new Integer(num));
}
public static void main(String[] args){
A a=new A();

A b=a;
A c=a;
b.add(1);
System.out.println(b.a.get(0));
System.out.println(c.a.get(0));
}
}
...全文
72 点赞 收藏 8
写回复
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
suncs2001 2008-08-19
原理我懂了,不过我遇到的实际问题跟刚才那个测试程序不同,刚才那个可以通过new A()来解决,实际上我应该new的是一个Vector里的返回值

class A{
Vector vec=new Vector();
......
}
class B{
public void add(int i ){
...
}
.....
}
public static void main(String[] args){
A base=new A();
B a=new B();
B b=new B();
B c=new B();
base.vec.add(a);
base.vec.add(b);
base.vec.aad(c);
//下面是要比较的 取出base对象中的vector中的第一个元素,给他节点加1,但是还要保留一个原始的不加的,因为还要计算比较.这个声明我就不知道怎么写了.注释的是我最原来写的,改成下面这样写也不可以.不清除应该到底怎么改.
B temp1=new B();
B temp2=new B();
//B temp1=base.vec.get(0);
//B temp2=base.vec.get(0);
temp1.add(1);

}

回复
sd5816690 2008-08-19
直接 base.clone() 就行了,不用克隆base中的每个对象
下面是一个例子

package com.qq.server;

import java.util.Vector;

public class Test2 {
public static void main(String[] args) {
Vector<B> base = new Vector<B>();

base.add(new B());
base.get(0).add(123);

Vector<B> a = (Vector<B>) base.clone();

a.add(new B());

System.out.println(base.size());
System.out.println(a.size());

// 下面证明不用克隆每个对象
System.out.println(a.get(0).getArray().size());// 第一个 B 中的 array 有一个 new Integer(123)
System.out.println(a.get(1).getArray().size());// 第二个 B 中的 array 没有元素
}
}

class B {
private Vector<Integer> array = new Vector<Integer>();

public Vector<Integer> getArray() {
return array;
}

public void setArray(Vector<Integer> array) {
this.array = array;
}

public B() {

}

public void add(int i) {
array.add(new Integer(i));
}
}

回复
suncs2001 2008-08-19
这是对象复制的问题,刚刚又找了下有关的资料看了下,不过我有个问题就是base里面的vector中的元素每个都是一个B类的实例,如果对base.clone()的话,需不需要对Vector里面的每个类B的实例clone(),这也是我对深克隆和浅克隆不懂的地方,刚才试了下不克隆vector,好像不行,不知道是不是我写的代码有问题还是需要克隆.
回复
justinavril 2008-08-19
[Quote=引用 1 楼 sd5816690 的回复:]
A b=a;
A c=a;
使得 b 和 c,指向了同一个对象

下面就可以解决
A b = new A();
A c = new A();
[/Quote]
对啊 这样就解决了
回复
skyhits1921 2008-08-19
顶.
回复
sd5816690 2008-08-19
保留原始的不动?克隆一个就行了!

public static void main(String[] args) {
Vector base = new Vector();

base.add("0");

Vector a = (Vector) base.clone();

a.add("1");

System.out.println(base.size());
System.out.println(a.size());
}
回复
sd5816690 2008-08-18
但是由于只执行了
b.add(1);
所以
c.a 长度为0
导致c.a.get(0)会出异常
回复
sd5816690 2008-08-18
A b=a;
A c=a;
使得 b 和 c,指向了同一个对象

下面就可以解决
A b = new A();
A c = new A();
回复
发动态
发帖子
Java SE
创建于2007-09-28

6.1w+

社区成员

Java 2 Standard Edition
申请成为版主
社区公告
暂无公告