Переменная не меняет своего значения после выполненной операции - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть следующий фрагмент кода:

 int[] a = {1,2,3,4};
 int temp = a[0];
 a[0] = 2;
 System.out.println(temp); //1

Почему переменная temp не меняет свое значение на 2 после выполнения команды в строке 3?

Ответы [ 2 ]

3 голосов
/ 21 апреля 2020

В Java все присваивается по значению.

int[] a = {1,2,3,4};

В приведенной выше строке вы создаете массив, в котором хранятся 4 числа.

int temp = a[0];

Здесь вы назначаете значение, хранящееся в a[0] для переменной temp.

a[0] = 2;

Здесь вы переназначили значение в a[0], поэтому есть что-то новое, на что a[0] ссылается.

System.out.println(temp);

Печатает значение, хранящееся в переменной temp.


Переменные в Java не являются указателями. Они хранят ценности. Эти значения являются либо самим значением (для примитивов, например, 1100, false), либо ссылкой на сам объект. Когда вы используете оператор присваивания (=), вы говорите, что хотите, чтобы переменная слева сохраняла значение справа.

Это может быть либо значение примитива, либо значение ссылки на объект, который хранится в куче.

Разница между примитивами и объектами в данном случае фактически не имеет значения. Мы могли бы упростить код до:

a = {1,2,3} // we somehow declare four placeholders for values.
            // a, a[0], a[1], a[2]
temp = a[0] // here we say, that we want temp to have the same value as a[0]
            // a[0] doesn't care
a[0] = 10   // here we say, that we want a[0] to have the same value as 10
            // temp doesn't care

Чтобы добиться поведения, которое не удивило бы OP, нам понадобится следующий класс:

class Foo {
    int i;
    Foo(int i) {
        this.i = i;
    }
}

и

Foo[] a = new Foo[]{new Foo(1), new Foo(2)};
Foo temp = a[0];
a[0].i = 100;
System.out.println(temp.i); //100
0 голосов
/ 21 апреля 2020

Значение temp присваивается с a[0], что на момент назначения равно 1

Затем вы меняете значение a[0] на 2. Это не меняет значение temp

Чтобы изменить temp, вам следует переназначить новое значение с помощью temp = a[0]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...