2012-06-29 24 views
13

¿Alguien puede aclarar la importancia del siguiente código.Declaración de objeto como final en java

class A 
{ 
    int i = 10; 

    public void setI(int b) 
    { 
     i = b; 
    } 

    public int getI() 
    { 
     return i; 
    } 
} 

class Test 
{  
    public static void main(String args[]) throws Throwable 
    { 
     final A ob = new A(); 
     ob.setI(10); 
     System.out.println(ob.getI()); 
    } 
} 

El objeto A se declara como final, pero puede cambiar el valor de la variable de instancia de este objeto y también retrive el valor actualizado. Entonces, ¿cuál es el significado de declarar un objeto como final? Soy consciente de declarar el tipo de datos primitivo como final, lo que hace que esa variable sea constante.

Respuesta

31

ob no podrá hacer referencia a ningún otro objeto: final keyword.

No se puede volver a asignar. Pero puedes cambiar sus partes internas (es mutable, si era originalmente). Así funciona esto:

final A ob = new A(); 
    ob.setI(6) 

pero esto no lo hace:

final A ob = new A(); 
    ob = new A(); 
+0

¿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? –

+0

@LinkTheProgrammer ¿qué opinas? – NimChimpsky

1

en Java, a diferencia de C++, todos los objetos son punteros, por lo que un objeto final se puede cambiar, sólo se puede' t apunte a cualquier lugar nuevo, es decir, no puede colocarlo en el lado izquierdo del operador de asignación.

3

Si un objeto es final puede llamar a cualquier método que realice cambios internos como de costumbre, pero no puede reasignar la referencia para que apunte a un objeto diferente. Intente hacer esto:

final A ob = new A(); 
ob = new A(); 

y observe que el código no se compilará.

Piense en esto como una referencia constante.

3

Esto significa que el siguiente no es posible:

final A ob = new A(); 
ob = new A(); // This is not possible 

La variable ob también se referirá a la instancia de la clase A que fue asignado primero a ella. Eso es lo que significa la palabra clave final en este caso. Significa que puede modificar los atributos de ob porque es un objeto normal como cualquier otra instancia de A.

2

Bueno, en caso de objeto, el valor de referencia es la dirección a los objetos. Por lo tanto, el valor de ob se dirigirá al objeto creado por new A(); que será definitivo y no podrá cambiar su valor. lo que significa que no puede asignar un nuevo objeto a esta referencia.

No puede escribir de esta manera.

final A ob = new A(); 

ob= new A(); // not allowed 
1

No habrá objetos constantes (finales) en java. Los objetos se crean en el área de memoria Heap. y podemos modificar el objeto en cualquier momento.
Sólo hay referencias (finales) constantes en java: significa que no puede modificar la referencia y reasignarla a cualquier otro objeto porque es constante y, a través de la referencia final, se refiere a un solo objeto que se está asignado durante la declaración.

Por lo tanto:

final A objectA = new A(); 
objectA.setI(6); 

es válida porque estamos cambiando sólo el contenido objeto, no el de referencia.

Pero:

final A objectA = new A(); 
    objectA = new A(); 

no es válida porque usted está tratando de modificar la referencia.

10

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).

Cuestiones relacionadas