Android中创建Test对象后添加到列表,ListView为何非空且显示"c"?
Android中创建Test对象后添加到列表,ListView为何非空且显示"c"?
兄弟,我来帮你拆解这段代码的执行逻辑,你就能明白为啥会出现这个结果了~
先看代码的实际执行顺序
咱们把你的关键代码按步骤拆解:
// 1. 创建第一个Test对象,testt指向它,给a赋值"aa" testt = new Test(); testt.a = "aa"; // 2. 这里重新创建了一个全新的Test对象,testt现在指向这个新对象! // 注意:之前那个a="aa"的对象现在没有任何引用了,会被GC回收,根本没加到列表里 testt = new Test(); // 3. 把当前testt指向的这个新Test对象(此时a还是null)添加到列表里 list.add(testt); // 4. 因为testt还是指向刚才加到列表里的那个对象,所以修改它的a属性,本质是修改列表中那个对象的属性 testt.a = "cc";
解答你的两个疑问
为什么ListView不是空的?
你确实调用了list.add(testt),往列表里添加了一个Test对象(虽然刚加进去的时候它的a是null),所以列表不是空的,ListView自然能显示内容。为什么显示的是"cc"(你写的"c"应该是笔误)?
因为Java里对象是引用类型,testt变量存的是对象的内存地址。你把testt指向的对象加到列表后,后续修改testt.a,其实是修改列表里那个对象的属性——它们指向的是同一个内存地址的对象。再加上你的Test类重写了toString()方法返回a,所以ListView最终显示的是你后来赋值的"cc"。
如果你想保留第一个"aa"的对象,应该这么改
要是你想把两个Test对象都加到列表里,得在重新赋值testt前把第一个对象加进去:
testt = new Test(); testt.a = "aa"; list.add(testt); // 先把第一个对象加进列表 testt = new Test(); testt.a = "cc"; list.add(testt); // 再加第二个对象
这样ListView就会显示"aa"和"cc"两个条目啦~
备注:内容来源于stack exchange,提问作者Ali Abbasi
相关产品推荐
相关产品推荐

