Ответ
Изменение ссылочной переменной внутри метода не влияет на исходную ссылку в вызывающем коде. Это происходит потому, что Java передает параметры по значению (pass-by-value), то есть в метод передается копия ссылки, а не сама исходная ссылка.
Сценарий 1: Замена ссылки (изменение не видно снаружи)
public class ReferenceExample {
static void replaceReference(List<String> list) {
// 'list' - это локальная копия ссылки. Мы меняем её на новый объект.
list = new ArrayList<>(); // Новая ссылка
list.add("New Element");
System.out.println("Inside method: " + list); // [New Element]
}
public static void main(String[] args) {
List<String> originalList = new ArrayList<>();
originalList.add("Original");
replaceReference(originalList);
// originalList по-прежнему ссылается на старый объект
System.out.println("Outside method: " + originalList); // [Original]
}
}
Сценарий 2: Изменение состояния объекта (изменение видно снаружи) Если использовать переданную копию ссылки для изменения внутреннего состояния объекта, эти изменения сохранятся, так как обе ссылки (оригинальная и копия) указывают на один и тот же объект в куче.
static void modifyContent(List<String> list) {
// Используем копию ссылки для изменения общего объекта
list.add("Modified Element");
list.set(0, "Changed");
}
public static void main(String[] args) {
List<String> originalList = new ArrayList<>(Arrays.asList("A", "B"));
modifyContent(originalList);
System.out.println(originalList); // [Changed, B, Modified Element]
}
Итог:
- Переопределить ссылку в вызывающем коде из метода нельзя.
- Изменить состояние объекта, на который эта ссылка указывает, можно, и это будет видно снаружи.