xxxhelloworld 2011-11-17 10:08
浏览 240
已采纳

for循环内外变量定义问题,不讨论效率

刚看到这个帖子,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
  • 写回答

5条回答 默认 最新

  • 爱上一条鱼 2011-11-17 10:41
    关注

    [quote]list中保存的是对象在内存中的地址吗?如果是这样貌似就理解了[/quote]
    可以这么理解,list里放了好多个引用 list.add(obj) 相当于再list里增加一个引用 指向obj指向的地址 然后即时obj =null了也和list无关了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵