В чем разница между следующими утверждениями
String name = "Tiger";
final String name ="Tiger";
Хотя класс String
имеет класс final
, почему нам нужно создать переменную String "CONSTANT" как final?
В чем разница между следующими утверждениями
String name = "Tiger";
final String name ="Tiger";
Хотя класс String
имеет класс final
, почему нам нужно создать переменную String "CONSTANT" как final?
final
в этом контексте означает, что переменная name
может быть назначена только один раз. Присвоение другому объекту String
снова приводит к ошибке компиляции.
Я думаю, что источником путаницы здесь является то, что ключевое слово final
может использоваться в нескольких разных контекстах:
См. статью Википедии о final в Java для примеров в каждом случае.
"final" означает разные вещи в двух случаях.
Класс java.lang.String является окончательным. Это означает, что вы не можете наследовать его.
Переменная "name" является окончательной, что означает, что вы не можете ее изменить, чтобы указать на другой экземпляр String. Таким образом, не конечная переменная String не является константой, потому что вы можете прочитать ее в два разных раза и получить разные значения.
Как это происходит, строковые объекты Java также неизменяемы. Это означает, что вы не можете изменить значение, которое представляет конкретный объект String. Сравните это с массивом - вы можете заменить первый элемент объекта массива на другой объект, но вы не можете заменить первый символ объекта String другим char. Вот почему String.replace() возвращает новую строку - он не может изменить старый.
Одна из причин, по которой String является окончательной, заключается в предотвращении экземпляра подкласса String, который реализует изменчивое поведение, передается вместо String.
Но можете ли вы изменить конкретный объект и можете ли вы назначить другой объект переменной, - это совершенно разные понятия. Один является свойством объектов String, а другой является свойством переменных String, которые являются ссылками на объекты String.
Помните, что ключевое слово Java final служит в этом случае двумя целями:
Посмотрите Последнее слово в ключевом ключе.
String name = "scott";
name = "tiger"; // OK
final String gender = "male";
gender = "female"; // won't compile you cannot reassign gender cause it final
Вы сбиваете с толку неизменное с окончательным.
Строка, такая как Integer и Long, является неизменным классом, поскольку внутренние данные защищены от модификации посредством инкапсуляции.
Однако, как сказал Айман, final ссылается на указатель на строку.
Если переменная отмечена как final, значение этой переменной не может быть изменено, т.е. ключевое слово final при использовании с переменной делает ее константой. И если вы попытаетесь для изменения значения этой переменной в ходе вашей программы компилятор даст вам ошибку.
ПРИМЕЧАНИЕ: Если вы помечаете переменную ссылочного типа как final, эта переменная не может ссылаться на какой-либо другой объект. Однако вы можете изменить содержимое объекта, потому что только сама ссылка является окончательной.
ИСТОЧНИК: Конечное ключевое слово в Java