modal - joptionpane java ejemplos
¿Por qué el bloque de inicializador estático no se ejecuta en este caso simple? (6)
La razón es que cuando jvm carga una clase, pone todos los miembros constantes de la clase en el área constante, cuando los necesita, simplemente los llama directamente por el nombre de la clase, es decir, no necesita crear una instancia de la clase de Z. por lo que el bloque de inicialización estática no se ejecuta.
class Z
{
static final int x=10;
static
{
System.out.println("SIB");
}
}
public class Y
{
public static void main(String[] args)
{
System.out.println(Z.x);
}
}
Salida: 10 ¿Por qué el bloque de inicialización estática no se carga en este caso? cuando estática x llame para que todo el miembro estático de la clase z se cargue al menos una vez, pero no se cargue el bloque de inicialización estática.
Los campos que tienen el modificador estático en su declaración se llaman campos estáticos o variables de clase . Están asociados con la clase, en lugar de con cualquier objeto. Cada instancia de la clase comparte una variable de clase, que está en una ubicación fija en la memoria. Cualquier objeto puede cambiar el valor de una variable de clase, pero las variables de clase también se pueden manipular sin crear una instancia de la clase
Entonces, cuando llamas a Zx
como abajo:
System.out.println(Z.x);
No inicializará la clase, excepto cuando llame a ese Zx
obtendrá esa x
de esa ubicación de memoria fija.
El bloque estático se ejecuta cuando JVM carga la class Z
Que nunca se carga aquí porque puede acceder a esa x
directamente sin cargar la clase.
No se ejecuta porque la clase nunca se carga.
public class Y
{
public static void main(String[] args)
{
Z z new Z(); //will load class
System.out.println(Z.x);
}
}
Como el campo x
en Z
se ha declarado con static final
, se crean en una ubicación de memoria fija. El acceso a este campo no requiere la carga de la clase.
Si X no hubiera sido final, en ese caso JVM tiene que cargar la clase ''Z'' y luego solo se ejecutará el bloque estático. Ahora JVM no necesita cargar la clase ''Z'' para que no se ejecute el bloque estático.
el tiempo de compilación Zx se convierte en 10, porque
static final int x=10; is constant
por lo que el compilador crea código como se indica a continuación, después de en línea
System.out.println(10); //which is not calling Z class at runtime
Una constante se llama constante perfecta si se declara como estática final. Cuando el compilador compila la clase y & mientras compila sop (Zx) reemplaza sop (Zx) con sop (10) bcz x es una constante perfecta que significa en código de bytes clase Y no usa clase Z así que mientras ejecuta clase Y clase Z no es cargar es por eso que SIB de la clase Z no se ejecuta.