public class Main {
public static void main(String args[]){
Task task=new Task();
List list1=new ArrayList();
List list2=new ArrayList();
List list3=new ArrayList();
list1.add("list11");
list1.add("list12");
task.setList(list1);
list2=task.getList();
System.out.println("task.getList()获取的list的size="+task.getList().size());
for(int i=0;i<task.getList().size();i++){
System.out.println(task.getList().get(i));
}
System.out.println("list2的size="+list2.size());
for(int i=0;i<list2.size();i++){
System.out.println(list2.get(i));
}
task.getList().add("list13");
System.out.println("task.getList()获取的list的size="+task.getList().size());
for(int i=0;i<task.getList().size();i++){
System.out.println(task.getList().get(i));
}
System.out.println("list2的size="+list2.size());
for(int i=0;i<list2.size();i++){
System.out.println(list2.get(i));
}
list3.add("list3");
task.setList(list3);
System.out.println("task.getList()获取的list的size="+task.getList().size());
for(int i=0;i<task.getList().size();i++){
System.out.println(task.getList().get(i));
}
System.out.println("list2的size="+list2.size());
for(int i=0;i<list2.size();i++){
System.out.println(list2.get(i));
}
list1.add("list14");
System.out.println("list2的size="+list2.size());
list2=list3;
System.out.println("list2的size="+list2.size());
list3.add("list32");
System.out.println("list2的size="+list2.size());
}
}
import java.util.List;
public class Task {
private List list;
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
}
试着运行上面的代码。关注下list2的变化情况。看明白了没?
上面的例子其实只是说明了一点:将一个List对象赋值给另一个list变量。实际只是相当于将“引用”地址赋给了list变量。这个道理可能谁都明白,至少在书本上看过,但也许放在实际的例子上会犯糊涂了。
比如上面的第一次Task.setList(list1),然后list2=Task.getList();。整个过程其实分为两步骤:第一步:对象task的成员变量list指向了list1指向的地址,第二步,通过list2=Task.getList();,list2也指向了list1的地址。所以三个“List”指向的地址相同,保存的内容也是一样的。然后,Task.setList(list3)后,对象task的成员变量list指向了list3指向的地址了,内容自然也就不和ist1指向的一样。而list2并没有改变。