刚看到这个帖子,http://www.iteye.com/topic/1117927(obj使用后赋值null讨论) 看了后拿着代码运行了下,又稍微调整了几次重新运行,感觉跟自己想的有点不大一样,希望大牛们帮忙解下疑惑
import java.util.ArrayList;
import java.util.List;public class AA {
public static void main(String[] args) {
List<TestObject> objs = new ArrayList<TestObject>();
//TestObject obj = null;
TestObject obj = new TestObject();
for (int i = 0 ;i < 3; i++) {
obj.setName("test" + String.valueOf(i));
objs.add(obj);
}
for (TestObject testObject : objs) {
testObject.showInfo();
}
}
}class TestObject {
private String name;public void showInfo() { System.out.println(this.getName()); } public String getName() { return name; } public void setName(String name) { this.name = name; }
}
上面的程序输出很容易看出来:
test2
test2
test2
如果main方法中换成下面的代码
List<TestObject> objs = new ArrayList<TestObject>();
//TestObject obj = null;
TestObject obj = new TestObject();
for (int i = 0 ;i < 3; i++) {
obj = new TestObject();
obj.setName("test" + String.valueOf(i));
objs.add(obj);
}
for (TestObject testObject : objs) {
testObject.showInfo();
}
结果就变了:
test0
test1
test2
这个有点不好理解,感觉obj始终都是一个引用,指向的地址在变而已,觉得应该跟之前一样。不知道具体内存是如何分配的。。。
如果main方法改成这样
List<TestObject> objs = new ArrayList<TestObject>();
//TestObject obj = null;
TestObject obj = new TestObject();
for (int i = 0 ;i < 3; i++) {
obj.setName("test" + String.valueOf(i));
objs.add(obj);
obj = null;
}
for (TestObject testObject : objs) {
testObject.showInfo();
}
输出时肯定会报空指针异常
那为什么这样
List<TestObject> objs = new ArrayList<TestObject>();
//TestObject obj = null;
TestObject obj = new TestObject();
for (int i = 0 ;i < 3; i++) {
obj = new TestObject();
obj.setName("test" + String.valueOf(i));
objs.add(obj);
obj = null;
}
for (TestObject testObject : objs) {
testObject.showInfo();
}
又不会空指针异常呢?
同样,这段代码的输出呢?
List<TestObject> objs = new ArrayList<TestObject>();
//TestObject obj = null;
TestObject obj = new TestObject();
for (int i = 0 ;i < 3; i++) {
obj = new TestObject();
obj.setName("test" + String.valueOf(i));
objs.add(obj);
obj.setName("xxx"); // 跟 obj = null; 的区别?
}
for (TestObject testObject : objs) {
testObject.showInfo();
}
为什么又会是
xxx
xxx
xxx