先看程序:
public class test {
public static void main(String args[]) {
List list = new ArrayList();
String s="111";//flag
list.add(s);
s="222";//flag
list.add(s);
s="333";//flag
list.add(s);
Iterator it = list.iterator();
while (it.hasNext()) {
System.out.print(it.next().toString());
}
}
}
结果:111222333
请问如果我把“ //flag "String “对象换成Vo对象也就是下面的代码:
public class test {
public static void main(String args[]) {
List list = new ArrayList();
SA1100TRANValueObject vo = new SA1100TRANValueObject();
vo.setDbClass("111");
list.add(vo);
vo.setDbClass("222");
list.add(vo);
vo.setDbClass("333");
list.add(vo);
Iterator it = list.iterator();
while (it.hasNext()) {
System.out.print(((SA1100TRANValueObject)it.next()).getDbClass());
}
}
}
结果却是:333333333
public class test {
public static void main(String args[]) {
List list = new ArrayList();
String s="111";//flag
list.add(s);
s="222";//flag
list.add(s);
s="333";//flag
list.add(s);
Iterator it = list.iterator();
while (it.hasNext()) {
System.out.print(it.next().toString());
}
}
}
结果:111222333
请问如果我把“ //flag "String “对象换成Vo对象也就是下面的代码:
public class test {
public static void main(String args[]) {
List list = new ArrayList();
SA1100TRANValueObject vo = new SA1100TRANValueObject();
vo.setDbClass("111");
list.add(vo);
vo.setDbClass("222");
list.add(vo);
vo.setDbClass("333");
list.add(vo);
Iterator it = list.iterator();
while (it.hasNext()) {
System.out.print(((SA1100TRANValueObject)it.next()).getDbClass());
}
}
}
结果却是:333333333
list.add(s)
s="222";//只指向另外一个对象
vo.setDbClass("111");
list.add(vo);
vo.setDbClass("222"); //对原对象的修改
因为并没有生成新的对象,List里的reference指向的对象都是同一个
每次vo.setDbClass("XXX");操作的都是同一个对象,
所以最后打印时是最后修改设定的DbClass值;
所以你应当在每次list.add(arg)时都生成一个新的对象
...
SA1100TRANValueObject vo = new SA1100TRANValueObject();
vo.setDbClass("222");
list.add(vo);
....
有所不同的是,String是恒常类,值是不可变更的,
每次对他负值String str=newValue;都会重新生成新的对象,
String赋值就象猴子掰苞谷,掰一个丢一个。因此最后有3个String对象,s是指向最后一个的。
而你自己的那个VO,搞来搞去只有一个。
可那样理解,两个不同的指针变量指向同一个变量!
不管利用那一个指针进行变量值的运算都会使他
他指向的变量发生改变.
两个不种的指向相同对象的对象指针,同理可想而知.
java (类似) c++
String a; 类名 对象变量1
......... 类名* 对象指针1=&对象变量
Stirng b; 类名 对象指针2=对象指针
a=b; 可想成a与b是指同一个对像的不同对象指针.
指向同一块内存空间,对其中的一个都可对那块内存数据的改变.
存在那样的原因也与JAVA中存那样的机制有关!!
那就是JAVA中的对象与对象变量的区别与联系.
JAVA中的对象好比C++中的已初使化的对象(C++中 类名 对象名 一定义对象就自动调用构造默认构造函数,当然也可以自己调用自定义构造涵数来初使化对象)JAVA没有C++这样的机制.
类名 变量 仅此是一个指向对象的指针 对象变量+指向内存中的有效数据就与为了一个实实在在的对象.(JAVA)
JAVA中的对象变量好比C++中的指向对象的对象指针~~
总而言之把JAVA中的对象名当做C++中指向对象的对象指针~
这样的理解再好不过!
aa = "222";
在内存里开辟了2块内存区域,可以理解为有2个对象.虽然他们的对象应用名相同,但是指向了不同的内存区域.SA1100TRANValueObject vo = new SA1100TRANValueObject();
vo.setDbClass("111");只要你的vo没有再new,vo就永远指向一个对象.他的setDbClass和你最后调用一致