Siempre estoy confundido entre static
y final
palabras clave en Java .
En qué se diferencian ?
Veamos primero las variables estáticas y los métodos estáticos.
Class.variable
Class.methodName()
this
o super
palabras clave de todos modos.Java también tiene "clases anidadas estáticas". Una clase anidada estática es solo una que no tiene implícitamente una referencia a una instancia de la clase externa.
Las clases anidadas estáticas pueden tener métodos de instancia y métodos estáticos.
No existe una clase estática de nivel superior en Java.
El método principal es
static
que debe ser accesible para que una aplicación se ejecute antes de que se produzca una instanciación.
final
La palabra clave se utiliza en varios contextos diferentes para definir una entidad que luego no se puede cambiar.Una final
clase no puede ser subclaseada. Esto se hace por razones de seguridad y eficiencia. En consecuencia, muchas de las clases de biblioteca estándar de Java son final
, por ejemplo, java.lang.System
y java.lang.String
. Todos los métodos en una final
clase son implícitamente final
.
Un final
método no puede ser anulado por subclases. Esto se utiliza para evitar un comportamiento inesperado de una subclase que altera un método que puede ser crucial para la función o la coherencia de la clase.
Una final
variable solo se puede inicializar una vez, ya sea a través de un inicializador o una declaración de asignación. No necesita ser inicializado en el punto de declaración: esto se llama blank final
variable. Una variable de instancia final en blanco de una clase debe asignarse definitivamente al final de cada constructor de la clase en la que se declara; de manera similar, una variable estática final en blanco debe asignarse definitivamente en un inicializador estático de la clase en la que se declara; de lo contrario, se produce un error en tiempo de compilación en ambos casos.
Cuando se define una clase interna anónima dentro del cuerpo de un método, todas las variables declaradas final
en el alcance de ese método son accesibles desde la clase interna. Una vez que se ha asignado, el valor de la variable final no puede cambiar.
Class.methodName()
estática significa que pertenece a la clase, no una instancia, esto significa que solo hay una copia de esa variable / método compartida entre todas las instancias de una Clase en particular .
final no tiene ninguna relación, es una forma de definir una inicialización única. Puede inicializar al definir la variable o dentro del constructor, en ningún otro lugar.
note Una nota sobre los métodos finales y las clases finales, esta es una forma de declarar explícitamente que el método o la clase no pueden ser anulados / extendidos respectivamente.
Lectura adicional Entonces, en el tema de la estática, estábamos hablando de los otros usos que puede tener, a veces se usa en bloques estáticos. Cuando se usan variables estáticas, a veces es necesario configurar estas variables antes de usar la clase, pero desafortunadamente no se obtiene un constructor. Aquí es donde entra la palabra clave estática.
No debe confundirse con los bloques de inicializador de instancia que se invocan antes del constructor por instancia.
fuente
final is entirely unrelated, it is a way of defining a once only initialization. You can either initialize when defining the variable or within the constructor, nowhere else.
Los dos realmente no son similares.
static
Los campos son campos que no pertenecen a ninguna instancia particular de una clase .Aquí, el
static
campon
no está asociado con ninguna instancia en particular,C
sino con toda la clase en general (es por eso queC.n
se puede usar para acceder a él). ¿Todavía puedes usar una instancia deC
para accedern
? Sí, pero no se considera una práctica especialmente buena.final
por otro lado indica que una variable particular no puede cambiar después de que se inicializa.Aquí,
n
no se puede reasignar porque lo esfinal
. Otra diferencia es que cualquier variable puede declararsefinal
, mientras que no todas las variables pueden declararse estáticas.Además, se pueden declarar clases
final
que indican que no se pueden extender:Del mismo modo, los métodos se pueden declarar definitivos para indicar que una clase extendida no puede anularlos :
fuente
public
clase potencial que define el archivo) ostatic
las clases internas pueden definirstatic
variables. Otras clases internas son instancias de la clase externa y no pueden tener variables estáticas.final
1) Cuando aplicamos la palabra clave " final " a una variable , el valor de esa variable permanece constante. (o) Una vez que declaramos una variable como final, el valor de esa variable no se puede cambiar.
2) Es útil cuando un valor variable no cambia durante la vida útil de un programa
estática
1) cuando aplicamos una palabra clave " estática " a una variable , significa que pertenece a la clase.
2) Cuando aplicamos una palabra clave " estática " a un método , significa que se puede acceder al método sin crear ninguna instancia de la clase
fuente
static
significa que solo hay una copia de la variable en la memoria compartida por todas las instancias de la clase.La
final
palabra clave solo significa que el valor no se puede cambiar. Sinfinal
, cualquier objeto puede cambiar el valor de la variable.fuente
Estática y final tienen algunas grandes diferencias:
Las variables o clases estáticas siempre estarán disponibles desde (prácticamente) en cualquier lugar. Final es solo una palabra clave que significa que una variable no se puede cambiar. Entonces si tuviera:
El programa se ejecutaría hasta que intentara cambiar el "primer" número entero, lo que provocaría un error. Fuera de esta clase, solo tendría acceso a la "primera" variable si hubiera instanciado la clase. Esto está en contraste con "segundo", que está disponible todo el tiempo.
fuente
Piensa en un objeto como un orador. Si Speaker es una clase, tendrá diferentes variables como volumen, agudos, graves, color, etc. Usted define todos estos campos mientras define la clase Speaker. Por ejemplo, declaró el campo de color con un modificador estático, lo que significa que le está diciendo al compilador que existe exactamente una copia de esta variable, independientemente de cuántas veces se haya instanciado la clase.
Declarando
se asegurará de que cada vez que se cree una instancia de esta clase, el valor del campo de color sea "Negro" a menos que no se cambie.
Nota: Ahora, una vez que cambie el color del altavoz como final, este código no se ejecutará, porque la palabra clave final asegura que el valor del campo nunca cambie.
Puede copiar / pegar este código directamente en su emulador e intentarlo.
fuente
Diferencia fácil
Final : significa que el Valor de la variable es Final y no cambiará en ningún lado. Si dice que final x = 5 significa que x no se puede cambiar, su valor es final para todos.
Estático: significa que solo tiene un objeto. supongamos que tiene x = 5, en la memoria hay x = 5 y está presente dentro de una clase. si crea un objeto o instancia de la clase, lo que significa que hay un cuadro específico que representa esa clase y sus variables y métodos. y si crea otro objeto o instancia de esa clase, significa que hay dos cuadros de esa misma clase que tienen diferentes x dentro de la memoria. y si llama a ambas x en diferentes posiciones y cambia su valor, entonces su valor será diferente. el cuadro 1 tiene x que tiene x = 5 y el cuadro 2 tiene x = 6. pero si hace que la x sea estática significa que no se puede volver a crear. puede crear un objeto de clase pero ese objeto no tendrá una x diferente en ellos. si x es estática, la casilla 1 y la casilla 2 tendrán la misma x que tiene el valor de 5. Sí, puedo cambiar el valor de static en cualquier lugar ya que no es final. así que si digo que el cuadro 1 tiene xy cambio su valor a x = 5 y luego hago otro cuadro que es box2 y cambio el valor de box2 x a x = 6. entonces, como X es estática, ambas cajas tienen la misma x. y ambas cajas darán el valor de caja como 6 porque box2 sobrescribe el valor de 5 a 6.
Tanto final como estático son totalmente diferentes. Final, que es final, no se puede cambiar. estático, que permanecerá como uno, pero se puede cambiar.
"Este es un ejemplo. Recuerde que las variables estáticas siempre se llaman por su nombre de clase. Porque son solo una para todos los objetos de esa clase. Por lo tanto, la Clase A tiene x = 5, puedo llamarla y cambiarla por Ax = 6; "
fuente
Estático es algo que cualquier objeto en una clase puede llamar, que pertenece inherentemente a un tipo de objeto.
Una variable puede ser final para toda una clase, y eso simplemente significa que ya no se puede cambiar. Solo se puede configurar una vez, e intentar configurarlo nuevamente generará un error. Es útil por varias razones, quizás desee declarar una constante, que no se puede cambiar.
Algún código de ejemplo:
Wikipedia contiene la lista completa de palabras clave de Java .
fuente
No intentaré dar una respuesta completa aquí. Mi recomendación sería centrarse en comprender lo que hace cada uno de ellos y luego debería ser claro ver que sus efectos son completamente diferentes y por qué a veces se usan juntos.
static
es para miembros de una clase (atributos y métodos) y debe entenderse en contraste con los miembros de instancia (no estáticos). Recomiendo leer "Comprender los miembros de instancia y clase" en los Tutoriales de Java. También puedo usarlo enstatic
bloques, pero no me preocuparía por eso para empezar.final
tiene diferentes significados según se aplique a variables, métodos, clases u otros casos. Aquí me gustan más las explicaciones de Wikipedia .fuente
Los valores de la variable estática se pueden cambiar aunque una copia de la variable atraviese la aplicación, mientras que los valores de la Variable final se pueden inicializar una vez y no se pueden cambiar en toda la aplicación.
fuente