"финал" означает разные вещи в двух случаях.
Класс java.lang.String является окончательным. Это означает, что вы не можете наследовать от него.
Переменная «имя» является окончательной, что означает, что вы не можете изменить ее, чтобы она указала на другой экземпляр String. Таким образом, неконечная строковая переменная не является константой, потому что вы можете прочитать ее два раза и получить разные значения.
Как это бывает, строковые объекты Java также являются неизменяемыми. Это означает, что вы не можете изменить значение, которое представляет конкретный объект String. Сравните это с массивом - вы можете заменить первый элемент объекта массива другим объектом, но вы не можете заменить первый символ объекта String другим символом. Вот почему String.replace () возвращает новую строку - она не может изменить старую.
Одна из причин, по которой String является окончательной, состоит в том, чтобы предотвратить передачу экземпляра подкласса String, реализующего изменяемое поведение, вместо String.
Но можете ли вы изменить конкретный объект и назначить ли другой объект переменной, это совершенно разные понятия. Один из них является свойством объектов String, а другой - свойством переменных String, которые являются ссылками на объекты String.