运行结果为
* 102
* 102
* 102
*
* 原因: 在内存中只存在一个data对象,用for循环向集合list中添加3的个元素都是同一个data对象
* for循环中,每次像data对象赋值,后者会替换前者,当最后一赋值后,那个变量val的值就为102
* 当遍历集合时:相当于执行了三次System.out.println(data.val),所以结果为3个换行的102
*
* 具体分析如下:
*/
// 创建Data类,定义int类型 成员变量 val
class Data {
int val;
}
public class Test01 {
public static void main(String args[]) {
//例化一个Data对象,这个对象保存在堆内存中,其中成员变量val也保存在堆内存中
Data data = new Data();
// 创建ArrayList集合 并且声明泛型类型为<Data>
ArrayList<Data> list = new ArrayList<Data>();
// for循环 i依次为100 101 102
for (int i = 100; i < 103; i++) {
// 给data对象的成员变量val赋值
data.val = i;
//在List添加data对象之前只是修改了data对象的成员变量val的值,但是并没有重新实例化对象
// 在内存中只存在一个data对象,用for循环向集合list中添加3的个元素都是同一个data对象
// for循环中,每次向data对象赋值,后者会替换前者,当最后一次赋值后,变量val的值为102
list.add(data);
}
// 遍历集合
for (Data d : list) {
//因为List添加的是同一个引用,所以在打印结果的时候,打印的也是同一个引用的最后一次被修改的值.
//即执行了三次System.out.println(data.val),结果为3个换行的102
System.out.println(d.val);
}
}
}
|