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

Ключевое слово Java для переменных

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

4b9b3361

Ответ 1

В Java термин final ссылается на ссылки, а неизменяемые - на объекты. Назначение модификатора 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

Как упоминается в статье в Википедии, если вы исходите из С++, вы должны отделить концепцию const до final и неизменную.

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

private final int status = 10;
status = 20; // WONT COMPILE because status is final