metodo - Clases de Java y bloques estáticos.
static method java que es (4)
Además de responder a la pregunta de cómo se ejecuta el código en qué orden, supongo que también quiere saber por qué un bloque estático puede referirse a una variable estática que aún no se ha declarado / ejecutado textualmente.
Mientras que la sección 12.4.2 de JLS explica que los bloques estáticos y la variable estática se ejecutan en el orden textual en que aparecen, la sección 8.3.3 de JLS explica cuándo puede hacer referencia a qué, y puede ver que la condición de The use is not on the left hand side of an assignment;
falla, lo que permite que su bloque estático en el segundo ejemplo se refiera a una variable estática que aún no se ha declarado / ejecutado textualmente en orden.
class Hello12 {
static int b = 10;
static {
b = 100;
}
}
class sample {
public static void main(String args[]) {
System.out.println(Hello12.b);
}
}
Al ejecutar el código anterior, la salida viene como 100 porque cuando llamé a la clase Hello, el bloque estático se ejecuta primero estableciendo el valor de b en 100 y mostrándolo. Pero cuando escribo este código:
class Hello12 {
static {
b = 100;
}
static int b = 10;
}
class sample {
public static void main(String args[]) {
System.out.println(Hello12.b);
}
}
Aquí la salida viene como 10. Espero que la respuesta sea 100 porque una vez que se ejecuta el bloque estático dio a b el valor como 100. así que cuando estaba en main (), llamé a Hello.b debería haber referido a b (= 100) . ¿Cómo se asigna la memoria a b en ambos códigos?
En el "Procedimiento de Inicialización Detallado" para las clases, la Sección 12.4.2 del JLS establece:
A continuación, ejecute los inicializadores de variable de clase y los inicializadores estáticos de la clase, o los inicializadores de campo de la interfaz, en orden textual , como si fueran un solo bloque.
Esto significa que es como si el primer ejemplo fuera:
b = 10;
b = 100;
Y el segundo ejemplo fue:
b = 100;
b = 10;
La última tarea "gana", explicando su salida.
Las estadísticas se evalúan en el orden en que aparecen en el programa.
Los bloques estáticos y las variables estáticas se inicializan en el orden en que aparecen en la fuente. Si su código es:
class Hello12 {
static int b = 10;
static {
b = 100;
}
}
El resultado es 100.