В Java: можно ли изменить состояние объекта, на который ссылается final-переменная?

«В Java: можно ли изменить состояние объекта, на который ссылается final-переменная?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, можно. Ключевое слово final гарантирует неизменность ссылки на объект, но не защищает от изменения внутреннего состояния (полей) самого объекта, если они не объявлены как final и класс предоставляет методы для их модификации.

Пример:

final Person person = new Person("Alice");
person.setName("Bob"); // Допустимо: меняем поле внутри объекта
// person = new Person("Charlie"); // Ошибка компиляции: нельзя изменить ссылку

Класс Person:

class Person {
    private String name;

    public Person(String name) { 
        this.name = name; 
    }

    public void setName(String name) { 
        this.name = name; 
    }
}

Почему это работает? Модификатор final применяется к переменной, а не к объекту в куче. Он предотвращает переназначение переменной, но не делает объект иммутабельным.