2010-10-25 18 views
20

He leído esta frase en un libro pero no lo entendía:final y estática en Java

Un campo que es a la vez estático y final tiene sólo una pieza de almacenamiento que no se puede cambiar.

¿Alguien me puede explicar esto?

+0

Tenga en cuenta que 'final' también tiene implementaciones de concurrencia. Se garantiza que un campo 'final' sea seguro para subprocesos de una manera que otros campos no lo son. Ver: mi respuesta aquí: http: // stackoverflow.com/questions/3974350/safe-publication-through-final/3974372 # 3974372 – andersoj

Respuesta

43

La fuente de su confusión puede ser que la palabra "estática" en Inglés y su significado en Java son solamente libremente relacionados .

Una variable definida en una clase Cat de la manera "normal" se puede denominar como una variable de instancia.

class Cat { 
    int weight; 
} 

Cada vez que se crea un nuevo objeto de tipo gato, se crea una nueva copia de la variable 'peso'. Si crea 10 objetos de tipo Cat, cada uno tiene su propia copia de la variable de peso.

Una variable "estática" se puede considerar como una variable de nivel de clase, a diferencia de una variable de instancia. Una variable estática tiene solo una copia y pertenece a la clase Cat en sí misma, en lugar de que haya una copia para cada objeto del tipo Cat.

class Cat { 
    static String speciesName; 

    int weight; 
} 

Aquí, independientemente del número de objetos de tipo gato que crean, sólo hay una copia de speciesName.

Si la variable estática también es 'final', esta copia de la variable es la única pieza de almacenamiento que no se puede cambiar. Si la variable "peso" fuera definitiva en el ejemplo anterior, habría 10 piezas de almacenamiento que no se podrían cambiar, una para cada objeto de tipo Cat que hayamos creado.

+0

Sé que esto es viejo, pero solo quería, de lejos, la explicación más sencilla, realmente me ayudó a entender esto. +1 – Script47

+0

muy bien explicado VS normal variable Gracias. –

+0

la mejor respuesta que encontré, gracias – Marco

23

Una variable static es común para todas las instancias de la clase. Una variable final no puede cambiar después de haber sido configurada la primera vez.

Por lo tanto, una variable static final en Java es común para todas las instancias de la clase, y no se puede cambiar después de haberse configurado por primera vez.

class Car { 

    static final int numberOfWheels = 4; 
    Color color; 

    public Car(Color color) { 
     this.color = color; 
    } 
} 

Car redCar = new Car(Red); 
Car blueCar = new Car(Blue); 

Cada coche tiene ahora un individuo y la propiedad variable de color y comparten la propiedad numberOfWheels que no puede ser cambiado.

+1

@Jonas: dudaría en llamar constante a una variable 'final', porque ese término se usa a menudo para variables de tiempo de compilación o variables que son asignado cuando se declaran. En cambio, describiría una variable 'final' como una que solo puede asignarse una vez (en el caso de un miembro de la clase, esto debería estar en el constructor). – Brian

+0

@Brian: tienes razón al respecto. He actualizado mi respuesta. – Jonas

+0

+1 ¡buena respuesta! –

0
  • medios finales no pueden volver a asignar valor a cualquier variable
  • estático significa sólo una copia de referencia puede ser en su totalidad en la clase de todos los métodos.
Cuestiones relacionadas