当前位置: 代码迷 >> J2SE >> 为什么这段代码会输出10个17?小弟我觉得每次list都添加进去了啊如何最后都被替换了
  详细解决方案

为什么这段代码会输出10个17?小弟我觉得每次list都添加进去了啊如何最后都被替换了

热度:5451   发布时间:2013-02-25 21:54:35.0
为什么这段代码会输出10个17?我觉得每次list都添加进去了啊?怎么最后都被替换了?

import java.util.ArrayList;
import java.util.List;

public class Test {
List<First> first ;

public List<First> getFirst() {
return first;
}
public void setFirst(List<First> first) {
this.first = first;
}
public static void main(String[] args) {
Test  test = new Test();
int i = 10 , j = 8 ;
First f = new First();
List<First> list = new ArrayList<First>();
while (i>0){
f.setK(j++);
f.setI("==");
list.add(f);
i--; 
}
test.setFirst(list);
for(First first : list){
System.out.println(first.getK());
}
}
}

class First {
private String i ;
private int k ;
public String getI() {
return i;
}
public void setI(String i) {
this.i = i;
}
public int getK() {[code=java]

return k;
}
public void setK(int k) {
this.k = k;
}
}[/code]


import java.util.ArrayList;
import java.util.List;

public class Test {
List<First> first ;

public List<First> getFirst() {
return first;
}
public void setFirst(List<First> first) {
this.first = first;
}
public static void main(String[] args) {
Test  test = new Test();
int i = 10 , j = 8 ;
First f ;
List<First> list = new ArrayList<First>();
while (i>0){
                        f = new First();
f.setK(j++);
f.setI("==");
list.add(f);
i--; 
}
test.setFirst(list);
for(First first : list){
System.out.println(first.getK());
}
}
}

class First {
private String i ;
private int k ;
public String getI() {
return i;
}
public void setI(String i) {
this.i = i;
}
public int getK() {
return k;
}
public void setK(int k) {
this.k = k;
}
}
这样是没有问题的。
改为

        List<First> list = new ArrayList<First>();
        while (i>0){第一种写法,只有一个First实例,list里存了10个这个实例的副本,当然是同一个值(为什么都是17呢?那是因为你最后一次更新的值是17,由于是同一个实例,所以每一次都把之前的给覆盖了)。

第二种些法,每一次循环都new一个First实例,list里存了10个不同的First实例,所以是不一样的结果。因为你加到list中的First对象都是同一个,每次修改也都是对同一个对象进行修改,所以最后结果都是17。刚才在论坛里还碰到一个类似的问题。
  相关解决方案