先看程序:
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

解决方案 »

  1.   

    String 是设计为不变模式String s="111";//flag
    list.add(s)
    s="222";//只指向另外一个对象 
    vo.setDbClass("111");
    list.add(vo);
            vo.setDbClass("222");  //对原对象的修改
      

  2.   

    那是必然的list中add的三个vo对象的DbClass都被你set成333了
      

  3.   

    那为什么String对象却可以变说下原理好吗?
      

  4.   

    你加入List的是指向你生成对象的reference(也就是地址),
    因为并没有生成新的对象,List里的reference指向的对象都是同一个
    每次vo.setDbClass("XXX");操作的都是同一个对象,
    所以最后打印时是最后修改设定的DbClass值;
    所以你应当在每次list.add(arg)时都生成一个新的对象
    ...
    SA1100TRANValueObject vo = new SA1100TRANValueObject();
    vo.setDbClass("222");
    list.add(vo);
    ....
    有所不同的是,String是恒常类,值是不可变更的,
    每次对他负值String str=newValue;都会重新生成新的对象,
      

  5.   

    你可以这样理解
    String赋值就象猴子掰苞谷,掰一个丢一个。因此最后有3个String对象,s是指向最后一个的。
    而你自己的那个VO,搞来搞去只有一个。
      

  6.   

    第二个如要得到111222333, 每次vo都得new
      

  7.   

    JAVA中对象与C++中的指向对象的指针有所相同!
    可那样理解,两个不同的指针变量指向同一个变量!
    不管利用那一个指针进行变量值的运算都会使他
    他指向的变量发生改变.
    两个不种的指向相同对象的对象指针,同理可想而知.
    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++中指向对象的对象指针~
    这样的理解再好不过!
      

  8.   

    String aa = "111";
    aa = "222";
    在内存里开辟了2块内存区域,可以理解为有2个对象.虽然他们的对象应用名相同,但是指向了不同的内存区域.SA1100TRANValueObject vo = new SA1100TRANValueObject();
    vo.setDbClass("111");只要你的vo没有再new,vo就永远指向一个对象.他的setDbClass和你最后调用一致