Подтвердить что ты не робот

Строка и финал

В чем разница между следующими утверждениями

String name = "Tiger";

final String name ="Tiger";

Хотя класс String имеет класс final, почему нам нужно создать переменную String "CONSTANT" как final?

4b9b3361

Ответ 1

final в этом контексте означает, что переменная name может быть назначена только один раз. Присвоение другому объекту String снова приводит к ошибке компиляции.

Я думаю, что источником путаницы здесь является то, что ключевое слово final может использоваться в нескольких разных контекстах:

  • final class: класс не может быть подклассом.
  • final method: метод нельзя переопределить.
  • Конечная переменная: переменная может быть назначена только один раз.

См. статью Википедии о final в Java для примеров в каждом случае.

Ответ 2

"final" означает разные вещи в двух случаях.

Класс java.lang.String является окончательным. Это означает, что вы не можете наследовать его.

Переменная "name" является окончательной, что означает, что вы не можете ее изменить, чтобы указать на другой экземпляр String. Таким образом, не конечная переменная String не является константой, потому что вы можете прочитать ее в два разных раза и получить разные значения.

Как это происходит, строковые объекты Java также неизменяемы. Это означает, что вы не можете изменить значение, которое представляет конкретный объект String. Сравните это с массивом - вы можете заменить первый элемент объекта массива на другой объект, но вы не можете заменить первый символ объекта String другим char. Вот почему String.replace() возвращает новую строку - он не может изменить старый.

Одна из причин, по которой String является окончательной, заключается в предотвращении экземпляра подкласса String, который реализует изменчивое поведение, передается вместо String.

Но можете ли вы изменить конкретный объект и можете ли вы назначить другой объект переменной, - это совершенно разные понятия. Один является свойством объектов String, а другой является свойством переменных String, которые являются ссылками на объекты String.

Ответ 3

Помните, что ключевое слово Java final служит в этом случае двумя целями:

  • это означает, что ссылка не может быть установлена ​​на другую строку, т.е. вы не сможете впоследствии "name =...";
  • но это важно, что ссылка правильно опубликована в других потоках (см. связанную статью для более подробной информации или таких работ, как Goetz et al, "Java Concurrency in Practice".

Ответ 5

Вы сбиваете с толку неизменное с окончательным.

Строка, такая как Integer и Long, является неизменным классом, поскольку внутренние данные защищены от модификации посредством инкапсуляции.

Однако, как сказал Айман, final ссылается на указатель на строку.

Ответ 6

Если переменная отмечена как final, значение этой переменной не может быть изменено, т.е. ключевое слово final при использовании с переменной делает ее константой. И если вы попытаетесь для изменения значения этой переменной в ходе вашей программы компилятор даст вам ошибку.

ПРИМЕЧАНИЕ:           Если вы помечаете переменную ссылочного типа как final, эта переменная не может ссылаться на какой-либо другой объект. Однако вы можете изменить содержимое объекта, потому что только сама ссылка является окончательной.

ИСТОЧНИК: Конечное ключевое слово в Java