Ответ
Две ссылки указывают на один объект, когда они содержат одинаковый адрес памяти (значение ссылки). Это происходит в следующих случаях:
1. Прямое присваивание ссылки:
Object original = new Object(); // Создан объект, 'original' ссылается на него
Object copyOfReference = original; // 'copyOfReference' получает КОПИЮ ЗНАЧЕНИЯ ссылки
// Теперь original и copyOfReference указывают на один объект.
System.out.println(original == copyOfReference); // true (сравнение ссылок)
2. Передача объекта в метод: В Java параметры передаются по значению. Для ссылочных типов передается копия значения ссылки, что приводит к тому, что параметр метода и исходная переменная начинают указывать на один объект.
void modify(List<String> list) { // 'list' — копия ссылки из 'myList'
list.add("New element"); // Изменяет общий объект
}
List<String> myList = new ArrayList<>();
modify(myList); // После вызова myList содержит "New element"
3. Возврат ссылки из метода:
public Object getSingleton() {
Object instance = new Object();
return instance; // Возвращается значение ссылки на объект
}
Object ref1 = getSingleton();
Object ref2 = getSingleton(); // ref1 и ref2 будут РАЗНЫМИ ссылками на РАЗНЫЕ объекты.
// Для синглтона метод всегда возвращал бы одну и ту же ссылку.
Важно: Оператор == сравнивает значения ссылок (адреса), а не содержимое объектов. Для сравнения содержимого используется метод .equals().