是谁把我的数组给更新了???

chenjie19891104 2009-10-19 03:06:23
在一个图形化界面中,两个按钮btn1和btn2,点击btn1的时候,调用函数function,他主要的功能是循环10次,对一个变量variable进行更新,就是每做一次循环,执行variable = variable + 1;然后将此时的viarable存储到一个数组viarableArray[]中保存(这个数组就是来记录variable各个每次循环的值)。单击第二个按钮时,希望在一个列表框中输出这个数组中的所有值(就是viarable每次循环时的值)。可是,现在当单击btn2时,显示出的结果都是循环结束时viarable的值。而在函数function中跟踪时发现viarableArray中的值是不同的,可是到了点击btn2的时候再次跟踪时发现又全部变成最后一次循环的时候的值了。
比如,原来viarable的值是0,按说应该输出1,2,3,4,5,6,7,8,9,10
可是现在输出的结果变成了:10,10,10,10,10,10,10,10,10,10

我想问一下:这到底是谁干的?还是我自己犯了某个未知的的错误??
...全文
163 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
saiche05 2009-10-19
  • 打赏
  • 举报
回复
修改一下

引用 8 楼 chenjie19891104 的回复:
代码太长了,是一个复杂系统中出现的一个小插曲,代码很长很长,上面只是我对这个小问题的变相描述,不过基本错误是一样的。另外说明一下:viarableArray是int型的二维数组。而viarable是int型的一维的数组。每次循环做一下操作:
varible[0] += 1;
varible[1] += 1;
varible[2] += 1;
int[] varibleCopy = variable;
varibleArray[i] = variableCopy;


是不是这里的int[] varibleCopy = variable;不是另外开辟一个单元,而只是指向原来的单元??




每次循环做一下操作:
varible[0] += 1;
varible[1] += 1;
varible[2] += 1;
最后当然是10,10,10,10,10,10,10,10,10,10

你应该有一个常量,

public static int ccc=0;
每次循环做一下操作:
ccc++;
if(ccc>=10){ccc=ccc%10;}// 避免数组越界
for(int j=ccc;j<10;j++)
varible[j] += 1;
saiche05 2009-10-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 chenjie19891104 的回复:]
代码太长了,是一个复杂系统中出现的一个小插曲,代码很长很长,上面只是我对这个小问题的变相描述,不过基本错误是一样的。另外说明一下:viarableArray是int型的二维数组。而viarable是int型的一维的数组。每次循环做一下操作:
varible[0] += 1;
varible[1] += 1;
varible[2] += 1;
int[] varibleCopy = variable;
varibleArray[i] = variableCopy;


是不是这里的int[] varibleCopy = variable;不是另外开辟一个单元,而只是指向原来的单元??


[/Quote]

每次循环做一下操作:
varible[0] += 1;
varible[1] += 1;
varible[2] += 1;
最后当然是10,10,10,10,10,10,10,10,10,10

你应该有一个常量,

public static int ccc=0;
每次循环做一下操作:
ccc++;
if(ccc>=10){ccc=ccc%10;}// 避免数组越界
varible[ccc] += 1;

gutan_fox 2009-10-19
  • 打赏
  • 举报
回复
恩,这点值得注意!
wangju309 2009-10-19
  • 打赏
  • 举报
回复
对象引用的问题
James__Zhan 2009-10-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 chenjie19891104 的回复:]
代码太长了,是一个复杂系统中出现的一个小插曲,代码很长很长,上面只是我对这个小问题的变相描述,不过基本错误是一样的。另外说明一下:viarableArray是int型的二维数组。而viarable是int型的一维的数组。每次循环做一下操作:
varible[0] += 1;
varible[1] += 1;
varible[2] += 1;
int[] varibleCopy = variable;
varibleArray[i] = variableCopy;


是不是这里的int[] varibleCopy = variable;不是另外开辟一个单元,而只是指向原来的单元??


[/Quote]

是啊,开辟空间需要new的操作,即便是数组也需要int[] arr = new int[10];

上面引用的太离谱了, 呵呵。
James__Zhan 2009-10-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 chenjie19891104 的回复:]
代码太长了,是一个复杂系统中出现的一个小插曲,代码很长很长,上面只是我对这个小问题的变相描述,不过基本错误是一样的。另外说明一下:viarableArray是int型的二维数组。而viarable是int型的一维的数组。每次循环做一下操作:
varible[0] += 1;
varible[1] += 1;
varible[2] += 1;
int[] varibleCopy = variable;
varibleArray[i] = variableCopy;

是啊,开辟空间需要new的操作,即便是数组也需要int[] arr = new int[10];


是不是这里的int[] varibleCopy = variable;不是另外开辟一个单元,而只是指向原来的单元??


[/Quote]
chenjie19891104 2009-10-19
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lo123 的回复:]
不是代码的问题。
是java的原理问题。
简单来解释:
new生成的对象在内存中只有一个(同一个内存地址),不同的声名都指向同一个内存地址。也就是你的variable
你每次加的都是那同一个对象(variable )。虽然你把他放在viarableArray[]中,但是viarableArray[i]也是指向variable 对象的(内存地址)。这里不是值的指向,而是内存地址的指向。
你最后的variable = 10
viarableArray[i]中,其实都是这个viarable的内存地址,从这个内存地址中读取值并显示出来。
你的结果
10,10,10,10,10,10,10,10,10,10
就是这样产生的。

[/Quote]

非常感谢,原来还是对机理不懂,才会犯下这么个错误。还问了这么个可笑的问题,原来是自己不懂得别人的性情,非要她按照自己的意愿来办事,导致了功败垂成。在这里非常感谢咖啡,哪天请你喝咖啡,你在哪工作,直接叫人送到你办公室。同时也感谢csdn中所有热心的朋友。希望以后的日子大家多多学习,多多交流,共同进步。对了,请问咖啡,希望得多少分的酬谢??算了,那天把我的分全给你了。
chenjie19891104 2009-10-19
  • 打赏
  • 举报
回复
代码太长了,是一个复杂系统中出现的一个小插曲,代码很长很长,上面只是我对这个小问题的变相描述,不过基本错误是一样的。另外说明一下:viarableArray是int型的二维数组。而viarable是int型的一维的数组。每次循环做一下操作:
varible[0] += 1;
varible[1] += 1;
varible[2] += 1;
int[] varibleCopy = variable;
varibleArray[i] = variableCopy;


是不是这里的int[] varibleCopy = variable;不是另外开辟一个单元,而只是指向原来的单元??

James__Zhan 2009-10-19
  • 打赏
  • 举报
回复
你的数组一定不是基本类型的数组,它的每个元素都hold某个对象的引用,执行完成后,你数组的所有元素都指向了同一个变量variable。当然得到的都是同一个值。建议把代码贴出来,让大伙帮你改改。
lo123 2009-10-19
  • 打赏
  • 举报
回复
不是代码的问题。
是java的原理问题。
简单来解释:
new生成的对象在内存中只有一个(同一个内存地址),不同的声名都指向同一个内存地址。也就是你的variable
你每次加的都是那同一个对象(variable )。虽然你把他放在viarableArray[]中,但是viarableArray[i]也是指向variable 对象的(内存地址)。这里不是值的指向,而是内存地址的指向。
你最后的variable = 10
viarableArray[i]中,其实都是这个viarable的内存地址,从这个内存地址中读取值并显示出来。
你的结果
10,10,10,10,10,10,10,10,10,10
就是这样产生的。
HelloAldis 2009-10-19
  • 打赏
  • 举报
回复
听说过个人思维陷阱没
你总是想的是自己希望的,但事实却是客观的,一个简单的逻辑错误可能发生在你的
程序中,而你却一直希望它运行的是自己的逻辑
编程建议:谈论程序是只说大概思想,说的在详细也没用,因为你编程可能犯错
探讨细节时给出Code,是最恰当的
老张-AI 2009-10-19
  • 打赏
  • 举报
回复
....悬疑贴呢

代码肯定有问题吧
stamp80 2009-10-19
  • 打赏
  • 举报
回复
肯定犯了哪个新手常犯的错误
amdgaming 2009-10-19
  • 打赏
  • 举报
回复
肯定是你干的 哈哈

把代码 贴出来。。。。
swandragon 2009-10-19
  • 打赏
  • 举报
回复
贴代码

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧