我是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循环以查看打印内容。我不太确定为什么它们都会再次成为零,或者我应该如何正确地重新评估这些元素。任何帮助表示赞赏。谢谢你的时间。
答案 0 :(得分:1)
它工作正常,但您检查错误的变量。您没有更改a
,b
&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)
当您将变量a
,b
和c
传递给数组时,它们是called by value
,这意味着创建了变量的副本并传递到数组中因此原始变量a
,b
和c
不会生效。
是按值调用的。
与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);
}
}