2015-06-10 4 views
1

Я новичок в Java, и у меня проблемы с математической тестовой программой, которую я создаю (не беспокойтесь, проблема не математическая). Я помещаю массив удвоений, равный нулю через цикл for, который присваивает им случайное число. Они сохраняют случайное число, но затем эти числа сбрасываются до нуля после выхода из цикла 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, чтобы увидеть, что печатает. Я не совсем уверен, почему все они снова становятся нулями или как я должен правильно переоценивать элементы. Любая помощь приветствуется. Спасибо за ваше время.

+5

Вы не меняете 'a',' b', 'с '. Это не то, как работает Java: «a = 5; b = a; b = 10; 'не изменяет' a'. – usr2564301

+0

В строке 6 'int [] abc = {a, b, c};' вы инициализируете новую зону в памяти со значениями копий b и c. Итак, теперь у вас есть 6 зон: a, b, c, abc [0], abc [1], abc [2]. – aurya

ответ

1

Он работает нормально, но вы проверяете неправильно variables.You не изменяя значения a, b & 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

Вашего массив а создаются с копией а, Ь и с значениями. Он действительно не содержит ссылки на a, b и c.

При изменении аЬса [я] вы modifiyng массива, БАУ не значение а, б или С.

Если вы хотите напечатать значения изменились, вы должны распечатать содержимое массива а.

+0

Ха-ха, черт возьми, я знал это ... как я пропустил это? Это то, что я получаю для программирования рано утром. Спасибо за быстрый ответ; Я очень ценю это. Решила проблему мгновенно.:] – Ray25Lee

+0

;) никогда не пытайтесь решить проблему перед cofee. ;) – Tirma

0

когда вы передаете переменные a, b и c в массиве они called by value, что означает, что копия переменной создается и переходит в массив, так что исходные переменные a, b и c не будет осуществляться.

В java-примитивах вызывается по значению.

В отличие от объектов в java, вызывается ссылкой, что означает, что исходный объект будет выполнен. здесь вам просто нужно добавить следующее:

a=abc[0]; 
b=abc[1]; 
c=abc[2]; 
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 

Код работает, как ожидалось, после цикла обратной связи нет значения.

Если вы все еще ищете для обновления значения, 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); 
    } 
}