黑马程序员技术交流社区
标题: 打印结果怎么是这个啊? [打印本页]
作者: 李强 时间: 2012-4-29 00:35
标题: 打印结果怎么是这个啊?
class Data {
int val;
int getVal() {
returnval;
}
void setVal(int val) {
this.val= val;
}
}
public class ListTest {
public static void main(String argv[]) {
Data data = new Data();
ArrayList list = new ArrayList();
for (int i=100; i<103; i++) {
data.setVal(i);
list.add(data);
}
int j = 0;
while (j < list.size()) {
Data tmp = (Data )list.get(j);
System.out.println("list(" + j + ") = " +tmp.getVal());
j++;
}
}
}
看了看结果没有明白?怎么会输出都一样呢?list(0)=102
作者: suiabing 时间: 2012-4-29 00:53
这个不是一个面试题吗?
好好分析一下就行了,哥们建议你多画画图,这个是我们刚做过的一道练习题,给你简单分析一下吧,明天还得上课呢,这个分不好赚啊!!
第一部分存储对象3个data到list中。同时修改data中的val值我们不用管他了多少,记住最总的值就行了。
第二部分输出list中对象对应的value值,list中存储的是对象地址,在这个题自始自终都是一个对象在变化,所以做种的list中的地址所对应的data对象值都是一样的,输出的data都是一个,data的val也当然是一个了
哦了,今天老师貌似在放分啊,期待!
睡觉了明天还得上课呢,有问题留言或Q我:443883861
作者: 金超 时间: 2012-4-29 00:57
应该是这个结果
list(0) = 100
list(1) = 101
list(2) = 102
作者: 黄秋 时间: 2012-4-29 07:32
1. LZ 不是说“怎么会输出都一样呢?list(0)=102”吗?以为是100,101,102;
2. 其实,Data data = new Data(); 在整个程序中只执行一次,也就是说只 new 一个Data 对象,故 data.setVal(i); 是同一个对象在设置值,会将原有的 Val 值覆盖;
3. 把 Data data = new Data(); 移到 for 循环内,这样每循环一次,就new 一个Data 对象,……。
作者: 罗旭维 时间: 2012-4-29 08:00
打印的结果是:
list(0) = 102
list(1) = 102
list(2) = 102
list虽然添加了3次但都是同一个对象data。
在for循环中添加元素的时候每次执行”data.setVal(i);“都重新设置了data的值,
所以data最终的值是最后一次执行”data.setVal(i);“后的值就是102,
作者: 根号5 时间: 2012-4-29 08:53
你这个题的打印结果是:
list(0) = 102;
list(1) = 102;
list(3) = 102;
这主要是因为你往list中add的全是同一个Data对象,for循环全是改的同一个对象的成员变量val,所以后面的会把前面的改的 val 覆盖掉。
我改了一下你的代码,能出现你想要的效果,如下:
package com.bosi;
import java.util.ArrayList;
class Data
{
int val;
int getVal()
{
return val;
}
void setVal(int val)
{
this.val = val;
}
}
public class ListTest
{
public static void main(String argv[])
{
ArrayList list = new ArrayList();
for (int i = 100; i < 103; i++)
{
Data data = new Data();//关键问题在这里,把创建对象的表达式放到for循环中来,这样的话list每次add的都是一个
//新的Data对象,这样的话就可以打印出正确结果。
data.setVal(i);
list.add(data);
}
int j = 0;
while (j < list.size())
{
Data tmp = (Data) list.get(j);
System.out.println("list(" + j + ") = " + tmp.getVal());
j++;
}
}
}
打印结果是:
list(0) = 100
list(1) = 101
list(2) = 102
作者: 根号5 时间: 2012-4-29 11:39
顶一下
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |