在for循环中存储值?

时间:2015-06-10 10:06:06

标签: java loops math for-loop store

我是Java的新手,我在创建数学测试程序时遇到了问题(不用担心;问题不是数学计算)。我通过for循环放置一个双数组,这些双精度数等于零,并为它们分配一个随机数。它们保留随机数,但是一旦退出for循环,这些数字就会重置为零。我想过,一旦我将更改的数字存储在一个循环中,它就会被永久更改,但事实并非如此吗?这是代码段:

        int a = 0;
        int b = 0;
        int c = 0;
        double x = 0;
        Random num = new Random();
        int[] abc = {a, b, c};
        for(int i = 0; i <= (abc.length-1); i++){
            int nums = num.nextInt(10);
            abc[i] = nums;
            System.out.println(abc[i]);
        }
        System.out.println(a + " " + b + " " + c);

我将一个system.out放入和放出for循环以查看打印内容。我不太确定为什么它们都会再次成为零,或者我应该如何正确地重新评估这些元素。任何帮助表示赞赏。谢谢你的时间。

4 个答案:

答案 0 :(得分:1)

它工作正常,但您检查错误的变量。您没有更改ab&amp;的值您要更改c值的abc个变量。 如果您选中abc,它会为您提供正确的值:

int a = 0;
int b = 0;
int c = 0;
double x = 0;
Random num = new Random();
int[] abc = {a, b, c};
for(int i = 0; i <= (abc.length-1); i++){
    int nums = num.nextInt(10);
    abc[i] = nums;
    System.out.println(abc[i]);
}
System.out.println(abc[0] + " " + abc[1] + " " + abc[2]);

答案 1 :(得分:1)

您的abc数组是使用a,b和c值的副本创建的。它实际上并不包含对a,b和c的引用。

当你修改abc [i]时,你修改了数组,bau不是a,b或C的值。

如果要打印更改的值,则必须打印数组abc的内容。

答案 2 :(得分:0)

当您将变量abc传递给数组时,它们是called by value,这意味着创建了变量的副本并传递到数组中因此原始变量abc不会生效。

java中的

是按值调用的。

与java中的对象不同,通过引用调用,这意味着原始对象将受到影响。 在这里你只需要添加:

a=abc[0];
b=abc[1];
c=abc[2]; 

答案 3 :(得分:0)

Java总是按值调用。在您的示例中:

int a = 0;
int b = 0;
int c = 0;
...
int[] abc = {a, b, c};// only values are copied 
for(int i = 0; i <= (abc.length-1); i++){
    ...
    abc[i] = nums; //updating index elements of array, not variables a, b or c
    ...
}
System.out.println(a + " " + b + " " + c); // all zeros as initial

代码按预期工作,for循环后没有值重置。

如果您仍在寻找更新价值,here就是解决方法( 按价值调用 ):

import java.util.Random;

class Ideone {
    public static void main (String[] args) {
        Data a = new Data(0),
            b = new Data(0),
            c = new Data(0);
        Data[] abc = {a, b, c}; //copied reference as value
        Random rand = new Random();
        for(Data d : abc) {
            d.i = rand.nextInt(10); //updating value at reference
            System.out.printf("d = %s\n", d);
        }
        System.out.printf("a = %s, b = %s, c = %s\n", a,b,c);//updated
    }
}

class Data {
    int i;
    public Data(int i) {
        this.i = i;
    }
    @Override
    public String toString() {
        return Integer.toString(i);
    }
}