Bloque estático en Java [duplicado]

Resuelto Mohit Deshpande asked hace 14 años • 7 respuestas

El otro día estaba revisando un código y me encontré con:

static {
    ...
}

Viniendo de C++, no tenía idea de por qué estaba ahí. No es un error porque el código se compiló bien. ¿Qué es este bloque de código "estático"?

Mohit Deshpande avatar May 31 '10 19:05 Mohit Deshpande
Aceptado

Es un inicializador estático . Se ejecuta cuando la clase se carga (o se inicializa, para ser precisos, pero normalmente no notas la diferencia).

Se puede considerar como un "constructor de clases" .

Tenga en cuenta que también hay inicializadores de instancia , que tienen el mismo aspecto, excepto que no tienen la staticpalabra clave. Estos se ejecutan además del código en el constructor cuando se crea una nueva instancia del objeto.

Joachim Sauer avatar May 31 '2010 12:05 Joachim Sauer

Es un inicializador estático. Se ejecuta cuando se carga la clase y es un buen lugar para inicializar variables estáticas.

De http://java.sun.com/docs/books/tutorial/java/javaOO/initial.html

Una clase puede tener cualquier número de bloques de inicialización estáticos y pueden aparecer en cualquier parte del cuerpo de la clase. El sistema de ejecución garantiza que los bloques de inicialización estáticos se llamen en el orden en que aparecen en el código fuente.

Si tiene una clase con un mapa de búsqueda estático, podría verse así

class MyClass {
    static Map<Double, String> labels;
    static {
        labels = new HashMap<Double, String>();
        labels.put(5.5, "five and a half");
        labels.put(7.1, "seven point 1");
    }
    //...
}

Es útil ya que el campo estático anterior no se pudo inicializar usando labels = .... Necesita llamar al método put de alguna manera.

aioobe avatar May 31 '2010 12:05 aioobe

Es un bloque de código que se ejecuta cuando un cargador de clases carga la clase. Está destinado a realizar la inicialización de miembros estáticos de la clase.

También es posible escribir inicializadores no estáticos, que parecen aún más extraños:

public class Foo {
    {
        // This code will be executed before every constructor
        // but after the call to super()
    }

    Foo() {

    }
}
Simon Lehmann avatar May 31 '2010 12:05 Simon Lehmann