Последнее ключевое слово Java для переменных - PullRequest
17 голосов
/ 16 ноября 2010

Как ключевое слово final не делает переменную неизменной? Википедия говорит, что это не так.

Ответы [ 6 ]

31 голосов
/ 16 ноября 2010

В Java термин окончательный относится к ссылкам, в то время как неизменный относится к объектам.Назначение модификатора final для ссылки означает, что он не может измениться, чтобы указывать на другой объект, но сам объект может быть изменен, если он изменчив.

Например:

final ArrayList<String> arr = new ArrayList<String>();
arr.add("hello"); // OK, the object to which arr points is mutated
arr = null; // Not OK, the reference is final and cannot be reassigned to

Asв статье в Википедии упоминается, что если вы пришли из C ++, вы должны отделить концепцию const от final и неизменную.

3 голосов
/ 16 ноября 2010

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

1 голос
/ 16 ноября 2010

Прочитайте остальную часть статьи в Википедии:

Чтобы проиллюстрировать, что окончательность не гарантирует неизменности: предположим, мы заменили три переменные позиции одной: public final Position Pos;где pos - это объект с тремя свойствами pos.x, pos.y и pos.z.Тогда pos не может быть назначен, но три свойства могут, если они сами не являются окончательными.

1 голос
/ 16 ноября 2010

Предположим, вы объявили, что myList является окончательным. Вы все еще можете добавлять новые элементы в myList, поэтому его состояние НЕ является неизменным. Из-за последнего ключевого слова вы не можете изменить myList для ссылки на другой список.

0 голосов
/ 16 ноября 2010

Для примитивов, таких как int, double, char и т. Д., Это работает больше, чем вы могли ожидать.

private final int status = 10;
status = 20; // WONT COMPILE because status is final
0 голосов
/ 16 ноября 2010

потому что, если ссылка является окончательной, вы все равно можете изменить вещи в объекте, на который указывает ссылка. Вы просто не можете изменить ссылку.

...