#java #arrays #types #pass-by-reference #pass-by-value
#java #массивы #типы #передача по ссылке #передача по значению
Вопрос:
Почему следующий код работает так, как будто он использует ссылочные типы, а не примитивные типы?
int[] a = new int[5];
int[] b = a;
a[0] = 1;
b[0] = 2;
a[1] = 1;
b[1] = 3;
System.out.println(a[0]);
System.out.println(b[0]);
System.out.println(a[1]);
System.out.println(b[1]);
И на выходе получается:
2
2
3
3
вместо
1
2
1
3
Ответ №1:
Содержимое массива int может не быть ссылками, но переменные int[] являются. Устанавливая b = a
, вы копируете ссылку, и два массива указывают на один и тот же фрагмент памяти.
Ответ №2:
Я описываю, что вы здесь делаете:
- создание массива целых чисел
int[] a = new int[5];
- создание ссылки на созданный массив
int[] b = a;
- добавление целого числа в массив «a», позиция 0
- перезапись ранее добавленного целого числа, поскольку b[0] указывает на то же местоположение, что и a[0]
- добавление целого числа в массив «a», позиция 1
- перезапись ранее добавленного целого числа снова, потому что b[1] указывает на то же местоположение, что и a[1]
Ответ №3:
вы не создаете новый экземпляр с помощью int[] b = a
если вам нужен новый экземпляр (и ожидаемый результат), добавьте clone()
: int[] b = a.clone()
удачи
Комментарии:
1. Итак, array — это объект с простой ссылкой?
2. @IgorDiy да, массив — это объект, большинство операций с массивами их не копируют (было бы ужасно дорого вызывать метод с массивом в качестве аргумента, если бы его нужно было скопировать!)
3. @IgorDiy, это объект, он даже наследует объект, например, new int[2].getClass().Возвращает getSuperClass() Object.class . В качестве бонуса в нем есть все методы, которые есть у объекта.
Ответ №4:
Оба a
и b
указывают на (является) одним и тем же массивом. Изменение значения в a
или b
приведет к изменению того же значения для другого.