Если вы укажете какую-либо конечную переменную, это означает, что вы не хотите, чтобы значение, которое оно содержит в памяти, изменилось. В случае примитивных типов это значение, представляемое переменными, является фактическими значениями. В случае типов объектов значения в памяти являются ссылками на объект, а не на фактические объекты.
Например, у вас есть:
final int x = 7;
final Object y = new Object();
Вы можете думать о данных, которые представлены в памяти таким образом:
+----------+----------+
| block | value |
+----------+----------+
| 1001 | 7 |
| 1002 | 2110 |
+----------+----------+
Ради обсуждения, давайте оставим в деталях о том, как Java фактически управляет памятью (потому что я тоже мало знаю об этом). Таким образом, в приведенном выше примере блок 1001 представлен переменной x и 1002 на y. Оба являются конечными переменными, что означает, что значения, которые они представляют, не могут быть изменены. В случае x это 7, что является фактическим значением, но в случае y 2110 является просто ссылкой на другое место памяти. Оба не могут измениться, но причина, по которой примитивные переменные типа становятся константами, состоит в том, что они представляют фактические значения. Но на самом деле вы можете сказать то же самое и для переменных типа объекта, что только константы, которые они представляют, являются ссылками. Таким образом, ключевое слово окончательно в этом отношении довольно последовательное.
Таким образом, с конечными переменными, если они являются примитивными типами, они будут постоянно представлять любые определенные значения, которые вы им задали. Если они являются объектами/ссылочными типами, они будут постоянно указывать на любой объект, на который вы указываете (независимо от изменчивости объектов).
Так в основном это запрещает назначать новый экземпляр объекта? Как насчет других вещей, таких как say: 'Image img = loadImage (" img.png ");'. вы могли бы тогда: 'img = loadImage (" image.png ");'? или это будет незаконным? –
@ LinkTheProgrammer, как вы думаете? – NimChimpsky