Bloque estático en Java [duplicar]


Esta pregunta ya tiene una respuesta aquí:

Estaba mirando un código el otro día y me encontré:

static {
    ...
}

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

 281
Author: Mohit Deshpande, 2010-05-31

7 answers

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

Puede ser considerado como un "constructor de clase".

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

 317
Author: Joachim Sauer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-20 19:46:14

Es un inicializador estático. Se ejecuta cuando se carga la clase y es un buen lugar para poner la inicialización de 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 tiempo 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 podría haberse inicializado usando labels = .... Tiene que llamar al método put de alguna manera.

 89
Author: aioobe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-15 19:03:13

Es un bloque de código que se ejecuta cuando la clase es cargada por un classloader. Está destinado a hacer la inicialización de los miembros estáticos de la clase.

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

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

    Foo() {

    }
}
 71
Author: Simon Lehmann,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-05 16:22:04

El bloque estático se puede usar para mostrar que un programa también puede ejecutarse sin la función principal.

//static block
//static block is used to initlize static data member of the clas at the time of clas loading
//static block is exeuted before the main
class B
{
    static
    {
        System.out.println("Welcome to Java"); 
        System.exit(0); 
    }
}
 15
Author: user3777803,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-26 05:14:29

Un bloque estático se ejecuta una vez en el ciclo de vida de cualquier programa, otra propiedad de static block es que se ejecuta antes del método main.

 6
Author: Zahid Hussain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-21 13:59:41

Los bloques estáticos se utilizan para inicializar el código y se ejecutarán cuando JVM cargue la clase.Consulte el siguiente enlace que da la explicación detallada. http://www.jusfortechies.com/java/core-java/static-blocks.php

 3
Author: sarath galimelu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-30 07:00:45

Sí, el bloque estático se utiliza para inicializar el código y se cargará en el momento en que se inicie JVM para su ejecución.

El bloque estático se usa en versiones anteriores de java, pero en la última versión no funciona.

 -2
Author: Piyush,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-29 10:04:54