Если массивы являются объектами в Java, почему назначение между массивами является глубоким копированием
Если массивы являются объектами, как указано в разделе Является ли массив объектами в Java, то почему вывод кода, приведенного ниже, равен [1,1,1]?
Я думал после выполнения заявления "а = б;" a и b все еще указывают на один и тот же контент! Разве это не должно быть теневой копией между объектами?
import java.util.Arrays;
public class Local {
int [] a = null;
public Local(){
int [] b = {1,1,1};
int [] c = {5,5};
a=b;
b=c;// 'a' should change too as a and b are both objects! right?
}
public static void main(String[] args) {
Local local = new Local();
System.out.println(Arrays.toString(local.a));
}
}
3 ответа
Позвольте мне попытаться объяснить это строка за строкой:
int [] b = {1,1,1};
На этой линии произошло три вещи.
- Создана переменная с именем
b
, - Создан массив
int
{1,1,1}
- назначенный
b
к массивуint
создан на шаге 2.
int [] c = {5,5};
То же самое произошло здесь
- Создана переменная с именем
c
, - Создан массив
int
{5,5}
- назначенный
c
к массивуint
создан на шаге 2.
a=b;
Теперь мы также назначены a
какой бы ни была ценность b
есть, который в данном случае является массивом int
{1,1,1}
Теперь у нас есть что-то вроде
b=c; // 'a' should change too as a and b are both objects! right?
То, что произошло здесь, это то, что мы назначили b
к чему угодно c
значение int
массив {5,5}
), сейчас b
не указывает на {1,1,1}
больше и так как Java передается по значению, a
Ценность осталась. Это не как a
указывает на ссылку b
что бы ни b
указывает на, a
будет указывать на это тоже.
Надеюсь это поможет.
// 'a' should change too as a and b are both objects! right?
Нет обоих a
а также b
просто ссылочные переменные, указывающие на один и тот же объект массива {1,1,1}
,
С помощью строки ниже вы делаете b
ссылаться на совершенно другой объект массива, где как a
все равно будет указывать на тот же объект массива {1,1,1}
как ссылка только b
но нет a
изменяется путем выполнения строки ниже
b = new int[] {2, 2};
Также делая a = b
вы заставляете их указывать на один объект массива {1,1,1}
и здесь не происходит глубокая / мелкая копия.
Переменная a не будет автоматически обновляться. в основном потому что
b = c //is like b = new int[]{5,5};
это та же концепция в вашем вопросе ранее с
b = new int[]{2,2,2};
a
указывает на b's
массив int, который равен [1,1,1]
и вы говорите b
указать на c
который [5,5]
a => b's array
b => c's array
так a
сохранит свой объект и b
будет новый.
Сначала b указывает на объект массива {1,1,1}
и вы назначаете b
к, так a
указывает на {1,1,1}
так что выход {1,1,1}