verificar descargar java

descargar - java offline



Diferencia entre una variable estática y una variable estática final en Java (5)

Generalmente, los miembros estáticos finales especialmente, las variables (o estática final por supuesto, pueden usarse en cualquier orden sin superponer el significado) se usan ampliamente con interfaces en Java para definir un comportamiento de protocolo para la clase implementadora, lo que implica que la clase que implementa (hereda) una interfaz debe incorporar todos los miembros de esa interfaz.

No puedo diferenciar entre un miembro estático final y uno final . El miembro estático final es aquel que es un miembro estático declarado como final o algo más? ¿En qué situaciones particulares deberían usarse específicamente?

Una variable estática o una variable estática final nunca se puede declarar dentro de un método ni dentro de un método estático ni dentro de un método de instancia. ¿Por qué?

Por consiguiente, el siguiente segmento de código no se compilará y el compilador emitirá un error en tiempo de compilación si se intenta compilarlo.

public static void main(String args[]) { final int a=0; //ok int b=1; //ok static int c=2; //wrong final static int x=0; //wrong }


No puedo diferenciar entre un miembro estático final y uno final. El miembro estático final es aquel que es un miembro estático declarado como final o algo más? ¿En qué situaciones particulares deberían usarse específicamente?

Use una final static cuando quiera que sea static . Use un final (no estático) cuando no quiera que sea static .

Una variable estática o una variable estática final nunca se puede declarar dentro de un método ni dentro de un método estático ni dentro de un método de instancia. ¿Por qué?

Decisión de diseño. Simplemente no hay forma de responder eso sin preguntarle a James Gosling.

Por consiguiente, el siguiente segmento de código no se compilará y el compilador emitirá un error en tiempo de compilación si se intenta compilarlo.

Porque viola la regla que acabas de describir.


Estás haciendo una gran mezcla de muchos conceptos diferentes. Incluso la pregunta en el título no se corresponde con la pregunta en el cuerpo.

De todos modos, estos son los conceptos que estás mezclando:

  • variables
  • variables finales
  • campos
  • campos finales
  • campos estáticos
  • campos estáticos finales

La palabra clave static tiene sentido solo para los campos, pero en el código que muestra está tratando de usarlo dentro de una función, donde no puede declarar los campos (los campos son miembros de las clases, las variables se declaran en los métodos).

Tratemos de describirlos rápidamente.

  1. las variables se declaran en métodos y se usan como algún tipo de almacenamiento local mutable ( int x; x = 5; x++ )

  2. las variables finales también se declaran en métodos, y se usan como un almacenamiento local inmutable ( final int y; y = 0; y++; // won''t compile ). Son útiles para detectar errores en los que alguien intentaría modificar algo que no debería modificarse. Personalmente, hago que la mayoría de mis parámetros locales de variables y métodos sean final . Además, son necesarios cuando los referencia desde clases anónimas internas. En algunos lenguajes de programación, el único tipo de variable es una variable inmutable (en otros idiomas, el tipo de variable "predeterminado" es la variable inmutable): como ejercicio, intente descubrir cómo escribir un ciclo que ejecute un número de veces especificado cuando no está permitido cambiar nada después de la inicialización. (¡Intenta, por ejemplo, resolver fizzbuzz con solo variables finales!).

  3. los campos definen el estado mutable de los objetos y se declaran en clases ( class x { int myField; } ).

  4. los campos finales definen el estado inmutable de los objetos , se declaran en clases y deben inicializarse antes de que finalice el constructor ( class x { final int myField = 5; } ). No pueden ser modificados. Son muy útiles cuando se realizan subprocesos múltiples, ya que tienen propiedades especiales relacionadas con compartir objetos entre subprocesos (se garantiza que cada subproceso verá el valor inicializado correctamente de los campos finales de un objeto, si el objeto se comparte después de que el constructor haya terminado, incluso si se comparte con razas de datos). Si quieres hacer otro ejercicio, intenta resolver fizzbuzz nuevamente usando solo campos finales, y ningún otro campo, ninguna variable ni parámetros de método (obviamente, puedes declarar parámetros en los constructores, ¡pero eso es todo!).

  5. los campos estáticos se comparten entre todas las instancias de cualquier clase . Puede pensar en ellos como algún tipo de almacenamiento mutable global ( class x { static int globalField = 5; } ). El ejemplo más trivial (y usualmente inútil) sería contar instancias de un objeto (es decir, class x { static int count = 0; x() { count++; } } , aquí el constructor incrementa el conteo cada vez que se lo llama, es decir, cada vez que creas una instancia de x con una new x() ). Tenga en cuenta que, a diferencia de los campos finales, no son intrínsecamente seguros para subprocesos; en otras palabras, seguramente obtendrás un recuento incorrecto de instancias de x con el código anterior si estás creando instancias de diferentes hilos; para hacerlo correcto, tendría que agregar algún mecanismo de sincronización o usar alguna clase especializada para este propósito, pero esa es otra pregunta (de hecho, podría ser el tema de todo un libro).

  6. los campos estáticos finales son constantes globales ( class MyConstants { public static final double PI = 3.1415926535897932384626433; } ).

Hay muchas otras características sutiles (como: los compiladores pueden reemplazar directamente las referencias a un campo estático final por sus valores, lo que hace que la reflexión sea inútil en tales campos; los campos finales pueden modificarse con la reflexión, pero esto es muy propenso a errores; etc.), pero yo diría que tienes un largo camino por recorrer antes de profundizar más.

Finalmente, también hay otras palabras clave que podrían usarse con campos, como transient , volatile y los niveles de acceso ( public , protected , private ). Pero esa es otra pregunta (en realidad, en caso de que quiera preguntar sobre ellos, muchas otras preguntas, diría).


La palabra clave final simplemente significa "esto no se puede cambiar". Se puede usar con ambos campos y variables en un método. Cuando una variable se declara final, un intento de cambiar la variable dará como resultado un error en tiempo de compilación. Por ejemplo, si declaro una variable como final int x = 12; tratar de incrementar x eso es (++ x) producirá un error. En resumen, con las primitivas finales se convierte en un valor constante. Por otro lado, static solo se puede aplicar con campos pero no con métodos. Un campo que es estático final tiene solo una parte de storage.final muestra que es una constante (no se puede cambiar), static muestra que solo es uno.


No puede declarar campos estáticos en el bloque estático, los campos estáticos solo pueden pertenecer a una clase, de ahí el error del compilador.


Los miembros estáticos son aquellos a los que se puede acceder sin crear un objeto. Esto significa que esos son miembros de la clase y nada que ver con ninguna instancia. y por lo tanto no se puede definir en el método.

Final en otros términos, es una constante (como en C). Puede tener una variable final dentro del método, así como a nivel de clase. Si pone final como estático, se convierte en "un miembro de la clase que es constante" .