Строка и финал - PullRequest
       14

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

27 голосов
/ 17 мая 2009

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

String name = "Tiger";

final String name ="Tiger";

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

Ответы [ 6 ]

52 голосов
/ 17 мая 2009

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

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

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

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

4 голосов
/ 17 мая 2009

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

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

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

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

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

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

2 голосов
/ 18 мая 2009

Посмотрите на Последнее слово в последнем ключевом слове .

String name = "scott";
name = "tiger"; // OK

final String gender = "male";
gender = "female"; // won't compile you cannot reassign gender cause it's final
2 голосов
/ 17 мая 2009

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

  • это означает, что ссылка не может быть установлена ​​на другую строку, т. Е. Вы не можете впоследствии выполнить "name = ...";
  • но, что важно, это означает, что ссылка правильно опубликована в других потоках (подробности см. В связанной статье или в работах, таких как Гетц и др., «Параллелизм Java на практике».
1 голос
/ 17 мая 2009

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

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

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

0 голосов
/ 11 января 2012

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

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

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

...