El orden general de operaciones de inicialización es (después de cargar la clase y antes del primer uso):
- estático (clase) bloques de código en el orden en que aparece en el código, código
- Objeto bloques para que aparezca en el código (bloques de inicialización y asignaciones).
- constructores
Ciertamente no me refiero constructores y funciones del cuerpo como un bloque de código anteriormente.
No sé qué tal final static
campos. Parece que siguen las reglas de los campos static
y no pueden referenciarse antes de la declaración a pesar de los comentarios anteriores de que se inicializaron en el paso de compilación. Si se hace referencia antes de que haya un error de compilación:
Example.java:8: illegal forward reference
System.err.println("1st static block j=" + j);
Tal final static
campos se puede inicializar y compilado en el archivo de clase, pero esto no es una regla general y que todavía no se puede hacer referencia antes de la declaración.
Ejemplo de código para comprobar orden de inicialización:
class Example {
final static int j = 5;
{
System.err.println("1st initializer j=" + j);
}
static {
System.err.println("1st static block j=" + j);
}
static {
System.err.println("2nd static block j=" + j);
}
final static java.math.BigInteger i = new java.math.BigInteger("1") {
{
System.err.println("final static anonymous class initializer");
}
};
Example() {
System.err.println("Constructor");
}
static {
System.err.println("3nd static block j=" + j);
}
{
System.err.println("2nd initializer");
}
public static void main(String[] args) {
System.err.println("The main beginning.");
Example ex = new Example();
System.err.println("The main end.");
}
}
Las impresiones de código snipset anteriores:
1st static block j=5
2nd static block j=5
final static anonymous class initializer
3nd static block j=5
The main beginning.
1st initializer j=5
2nd initializer
Constructor
The main end.
Somos humanos, no ordenador. Deberíamos tratar de hacer el código más directo en lugar de usar este tipo de trucos o trampas o lo que sea ... –
+1 porque no es una pregunta difícil pero buena, que estoy seguro ayudará a otros a entender el lenguaje y especialmente la estática modificador mejor. Respuesta muy útil dada por @JonSkeet sobre un tema algo importante, pero a menudo subestimado. – jorey
No me gusta cuando la gente usa 'Foo'. Use términos reales:/ – contactmatt