Si indica que una variable es definitiva, significa que no desea que cambie el valor que contiene en la memoria. En el caso de los tipos primitivos, ese valor representado por las variables son los valores reales. En el caso de tipos de objetos, los valores en la memoria son referencias al objeto y no a los objetos reales.
Por ejemplo, usted tiene:
final int x = 7;
final Object y = new Object();
Se puede pensar que los datos sean representados en la memoria de esta manera:
+----------+----------+
| block | value |
+----------+----------+
| 1001 | 7 |
| 1002 | 2110 |
+----------+----------+
Por el bien de la discusión, vamos a dejar de lado los detalles de cómo Java realmente administra la memoria (porque tampoco sé mucho sobre ella). Entonces, en el ejemplo anterior, el bloque 1001 está representado por la variable xy 1002 por y. Ambas son variables finales, lo que significa que los valores que representan no se pueden cambiar. En el caso de x, es 7, que es el valor real, pero en el caso de y, 2110 es solo una referencia a otra ubicación de memoria. Ambos no pueden cambiar, pero la razón por la que las variables de tipo primitivo se convierten en constantes es que representan valores reales. Pero en realidad, también puede decir lo mismo para las variables de tipo de objeto que las constantes que representan son referencias. Por lo tanto, la palabra clave final es bastante consistente en este sentido.
Por lo tanto, con las variables finales, si son tipos primitivos, representarán constantemente cualquier valor particular que usted haya establecido. Si son tipos de objeto/referencia, señalarán constantemente a cualquier objeto al que los dirija (independientemente de la mutabilidad de los objetos).
¿Básicamente esto no permite asignar una nueva instancia del objeto? ¿Qué pasa con otras cosas como, por ejemplo: 'Image img = loadImage (" img.png ");'. ¿podría entonces hacer: 'img = loadImage (" image.png ");'? o sería esto ilegal? –
@LinkTheProgrammer ¿qué opinas? – NimChimpsky