Digamos que un proyecto contiene varias clases, cada una de las cuales tiene un bloque de inicializador estático. ¿En qué orden se ejecutan esos bloques? Sé que dentro de una clase, dichos bloques se ejecutan en el orden en que aparecen en el código. He leído que es igual en todas las clases, pero un código de muestra que escribí no está de acuerdo con eso. He utilizado este código:¿En qué orden se ejecutan los bloques de inicializador estático/instancia en Java?
package pkg;
public class LoadTest {
public static void main(String[] args) {
System.out.println("START");
new Child();
System.out.println("END");
}
}
class Parent extends Grandparent {
// Instance init block
{
System.out.println("instance - parent");
}
// Constructor
public Parent() {
System.out.println("constructor - parent");
}
// Static init block
static {
System.out.println("static - parent");
}
}
class Grandparent {
// Static init block
static {
System.out.println("static - grandparent");
}
// Instance init block
{
System.out.println("instance - grandparent");
}
// Constructor
public Grandparent() {
System.out.println("constructor - grandparent");
}
}
class Child extends Parent {
// Constructor
public Child() {
System.out.println("constructor - child");
}
// Static init block
static {
System.out.println("static - child");
}
// Instance init block
{
System.out.println("instance - child");
}
}
y obtuve este resultado:
START
estática - abuelo
estática - padres
estática - niño
ejemplo - abuelo
constructor - abuelo
instancia - padre
constructor - los padres
ejemplo - niño
constructor - niño
FIN
La respuesta obvia de esto es que los bloques de los padres ejecutan antes de sus hijos, pero eso podría ser sólo una coincidencia y no ayuda si dos las clases no están en la misma jerarquía.
EDIT:
que modifica el código ejemplo añadiendo esto a LoadTest.java:
class IAmAClassThatIsNeverUsed {
// Constructor
public IAmAClassThatIsNeverUsed() {
System.out.println("constructor - IAACTINU");
}
// Instance init block
{
System.out.println("instance - IAACTINU");
}
// Static init block
static {
System.out.println("static - IAACTINU");
}
}
como lo implica el nombre de la clase, nunca hace referencia a la nueva clase en cualquier lugar. El nuevo programa produjo el mismo resultado que el anterior.
ver allí (super concisa y clara): Un http://blog.sanaulla.info/2008/06/30/initialization-blocks-in-java/ – Benj