在一个图形化界面中,两个按钮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我想问一下:这到底是谁干的?还是我自己犯了某个未知的的错误??

解决方案 »

  1.   

    听说过个人思维陷阱没 
    你总是想的是自己希望的,但事实却是客观的,一个简单的逻辑错误可能发生在你的
    程序中,而你却一直希望它运行的是自己的逻辑
    编程建议:谈论程序是只说大概思想,说的在详细也没用,因为你编程可能犯错
    探讨细节时给出Code,是最恰当的
      

  2.   

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

  3.   

    你的数组一定不是基本类型的数组,它的每个元素都hold某个对象的引用,执行完成后,你数组的所有元素都指向了同一个变量variable。当然得到的都是同一个值。建议把代码贴出来,让大伙帮你改改。
      

  4.   

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

  5.   


    非常感谢,原来还是对机理不懂,才会犯下这么个错误。还问了这么个可笑的问题,原来是自己不懂得别人的性情,非要她按照自己的意愿来办事,导致了功败垂成。在这里非常感谢咖啡,哪天请你喝咖啡,你在哪工作,直接叫人送到你办公室。同时也感谢csdn中所有热心的朋友。希望以后的日子大家多多学习,多多交流,共同进步。对了,请问咖啡,希望得多少分的酬谢??算了,那天把我的分全给你了。
      

  6.   


    是啊,开辟空间需要new的操作,即便是数组也需要int[] arr = new int[10]; 上面引用的太离谱了, 呵呵。
      

  7.   


    每次循环做一下操作:
    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;
      

  8.   

    修改一下引用 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;