Esto es directamente de http://www.programcreek.com/2011/10/java-class-instance-initializers/
1. Orden de ejecución
Mira la siguiente clase, ¿sabes cuál se ejecuta primero?
public class Foo {
//instance variable initializer
String s = "abc";
//constructor
public Foo() {
System.out.println("constructor called");
}
//static initializer
static {
System.out.println("static initializer called");
}
//instance initializer
{
System.out.println("instance initializer called");
}
public static void main(String[] args) {
new Foo();
new Foo();
}
}
Salida:
inicializador estático llamado
inicializador de instancia llamado
constructor llamado
inicializador de instancia llamado
constructor llamado
2. ¿Cómo funciona el inicializador de instancia de Java?
El inicializador de instancia anterior contiene una instrucción println. Para entender cómo funciona, podemos tratarla como una instrucción de asignación variable, por ejemplo, b = 0
. Esto puede hacer que sea más obvio de entender.
En vez de
int b = 0
podrías escribir
int b;
b = 0;
Por lo tanto, los inicializadores de instancia y los inicializadores de variable de instancia son más o menos lo mismo.
3. ¿Cuándo son útiles los inicializadores de instancia?
El uso de inicializadores de instancia es raro, pero aún así puede ser una alternativa útil a los inicializadores de variable de instancia si:
- El código de inicializador debe manejar excepciones
- Realice cálculos que no se puedan expresar con un inicializador de variable de instancia.
Por supuesto, dicho código podría escribirse en constructores. Pero si una clase tuviera múltiples constructores, tendría que repetir el código en cada constructor.
Con un inicializador de instancia, puede escribir el código una vez y se ejecutará sin importar qué constructor se use para crear el objeto. (Supongo que esto es solo un concepto, y no se usa con frecuencia).
Otro caso en el que los inicializadores de instancia son útiles son las clases internas anónimas, que no pueden declarar ningún constructor. (¿Será este un buen lugar para colocar una función de registro?)
Gracias a Derhein.
También tenga en cuenta que las clases anónimas que implementan interfaces [1] no tienen constructores. Por lo tanto, se necesitan inicializadores de instancia para ejecutar cualquier tipo de expresiones en tiempo de construcción.
public static void staticMethod(){}
, si ejecutaTestStatic.class.getMethod("staticMethod");
. El inicializador estático no se invocará. Más información aquí docs.oracle.com/javase/specs/jvms/se10/html/…