Ответ
Да, можно. Ключевое слово 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 применяется к переменной, а не к объекту в куче. Он предотвращает переназначение переменной, но не делает объект иммутабельным.