黑马程序员技术交流社区
标题:
黑马社招题
[打印本页]
作者:
zhenshuai888
时间:
2017-1-5 00:39
标题:
黑马社招题
1、分析运行结果,说明原理。(没有分析结果不得分)
import java.util.ArrayList;
class Data {
int val;
}
public class Test {
public static void main(String args[]) {
Data data = new Data();
ArrayList<Data> list = new ArrayList<Data>();
for (int i = 100; i < 103; i++) {
data.val = i;
list.add(data);
}
for (Data d : list) {
System.out.println(d.val);
}
}
}
求助 这个怎么分析啊
作者:
普通的瓶子
时间:
2017-1-5 00:53
飘过,还没学到这
作者:
痴恋雪玥
时间:
2017-1-5 07:39
下面是我的想法 不保证正确:
首先 Data这个类里有个成员变量 int 类型的 val
在 Test 这个类的主方法中 创建了 Data 类的对象 data
和泛型是 Data 的 ArrayList 集合 list
然后利用普通 for 循环 往 list 集合中添加元素 普通, for 循环中定义了一个 int 类型的变量 i ,i的初始化值是 100,每次循环自增 1,当 i = 103时跳出循环
在普通 for 循环中 访问 Data 类中默认的空参构造创建并赋于值 i
赋值后 将它的地址值存入 list 集合中
下面是增强 for 循环
左边是 Data 类型的 b ,右边是要遍历的 list 集合,每次循环把 list 集合中的一个元素 根据地址值找到对应的值 并打印到控制台,直到把 list 集合内的元素全部读完为止
作者:
愤怒的大飞机
时间:
2017-1-5 07:47
看不懂data.val是什么,至少得把data类贴出来吧,难不成是date类?那就更不懂了
作者:
痴恋雪玥
时间:
2017-1-5 08:14
刚有一个地方看错了
普通 for 循环中 list 添加的是 Data 对象 所以存的是同一个地址值 指向同一片内存空间
一共循环了两次 存入了两个地址值
前一个值会在第二次循环中,给 data.val 赋值的时候覆盖掉
所以最后打印到控制台的应该是:
102
102
作者:
痴恋雪玥
时间:
2017-1-5 08:15
最后打印到控制台的是 三个 102 而且每个 102 占一行
作者:
月微怜
时间:
2017-1-5 23:24
掉坑了。。这些细节。受教了。。。感谢分享
作者:
zhenshuai888
时间:
2017-1-6 00:00
亲 来个专业点的答复啊
作者:
WUKIMDA
时间:
2017-1-6 00:16
有点简单。。。。
作者:
WUKIMDA
时间:
2017-1-6 00:22
1.实例化Data对象,并给他的val赋值,,但是集合加的都是对象的地址值3次一样的。然后用增强for循环遍历集合,向控制台输出val的内容,3次都是102
输出是这样的:
102
102
102
以上。
作者:
zhenshuai888
时间:
2017-1-6 20:40
精彩 答的很精辟
作者:
一片叶~
时间:
2017-1-7 11:12
学习,学习
作者:
愤怒的大飞机
时间:
2017-1-7 13:17
KyneZhk 发表于 2017-1-7 10:51
有个问题这个类名取为Date不报错?
不会报错,首先没导包,然后就是有自己定义的类的话,就会首先用自己的类
作者:
newu
时间:
2017-1-7 15:08
亲 来个专业点的答复啊
作者:
zhenshuai888
时间:
2017-1-8 09:30
运行结果为
* 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);
}
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2