В 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