После тестирования кода (см. Ниже), я узнал, что я не понимаю некоторые основы.Явное понимание копирования копий
Класс А.
class A {
private String s;
private int[] array;
private B b;
public A(String s, int[] array, B b) {
this.s = s;
this.array = array;
this.b = b;
}
}
Класс B.
class B {
public int t;
public B(int t) {
this.t = t;
}
}
Я думал, что любые изменения, которые я сделал после того, как A a = new A(s, array, b);
затронет a
. Не все поля a
и переменные s
, array
, b
обратитесь к тому же объекту?
String s = "Lorem";
int array[] = new int[] {
10, 20, 30
};
B b = new B(12);
A a = new A(s, array, b);
s = "Dolor";
array = new int[] {
23
};
b = new B(777); // Initialized with a new value, a.b keeps the old one. Why?
System.out.println(a);
Выход.
String Lorem
Array [10, 20, 30]
B 12
И об этом.
B b2 = new B(89);
B b3 = b2;
System.out.println(b3);
b2 = null;
System.out.println(b3); // b2 initialized with null, b3 keeps the old one. Why?
Выход.
89
89
Однако, если у меня есть два списка, это показывает, что оба они относятся к тому же объекту.
ArrayList<String> first = new ArrayList<String>();
first.add("Ipsum");
ArrayList<String> second = new ArrayList<String>();
second = first;
first.add("The Earth");
System.out.println(second);
Выход.
[Ipsum, The Earth]
Теперь это ясно. Две переменные относятся к одному и тому же объекту. Если I ** изменить ** прежнюю переменную, последняя будет затронута. Если я просто ** назначу ** новое значение для первой переменной, оно будет ссылаться на новый объект, последний сохранит старую ссылку (и старое значение) –