Let expresar con un ejemplo más claro:
public class Test {
static {
System.out.println("static initializer");
}
{
System.out.println("instance initializer");
}
public Test() {
System.out.println("constructor");
}
}
y probarlo de la siguiente manera:
public class Main {
public static void main(String[] args) {
Test test1 = new Test();
Test test2 = new Test();
}
}
de salida:
static initializer
instance initializer
constructor
instance initializer
constructor
Los inicializadores estáticos se ejecutan sólo vez durante el tiempo de ejecución, específicamente durante la carga de la clase. Los inicializadores de instancia se ejecutan durante cada instanciación antes del constructor.
Puede tener más de uno de ellos y se ejecutarán en el orden en que aparecen en la codificación.
El principal beneficio de los inicializadores de instancias es que se ejecutan independientemente del constructor que use. Se aplican en cada uno de ellos para que no tenga que duplicar la inicialización común sobre todos ellos.
El principal beneficio de los inicializadores estáticos es que se ejecutan solo una vez durante la carga de la clase. Un ejemplo conocido del mundo real es el controlador JDBC. Cuando lo haga
Class.forName("com.example.jdbc.Driver");
que sólo ejecuta las static
inicializadores, entonces cualquier (decente) controlador JDBC se registrará en el DriverManager
de la siguiente manera
static {
DriverManager.registerDriver(new com.example.jdbc.Driver());
}
esta manera la DriverManager
puede encontrar el controlador JDBC derecha durante getConnection()
.
¿Entonces la palabra clave estática es opcional? – blackanchorage
entonces, si crea un bloque estático en el código anterior, ¿cuál ejecutará primero el bloque estático o el bloque de inicializador estático? .... ¿puede explicar qué es el inicializador estático? – Hariharbalaji
Definitivamente NO es un inicializador "estático". – BalusC