Bloque estático en Java [duplicate]

6 minutos de lectura

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

static {
    ...
}

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

Bloque estatico en Java duplicate
Joaquín Sauer

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 pensarse como un “constructor de clases”.

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

  • Entonces, ¿por qué usaría un inicializador de instancia no estático y no simplemente usaría el constructor de clase (se me ocurre que esto es útil en clases anónimas)?

    – Jori

    19 de julio de 2013 a las 9:59

  • @Jori: una razón común es si tiene varios constructores separados (que no simplemente “redirigir” a un solo canónico) y desea que todos tengan alguna inicialización en común.

    – Joaquín Sauer

    19 de julio de 2013 a las 10:10

  • Hace que el código sea más claro y menos repetitivo. La gente que hace las especificaciones de Java a veces hace las cosas más confusas, pero casi siempre hay una razón subyacente por la que lo hicieron de esa manera. Manipulación de flujo, ¿alguien?

    – Mindwin

    28/08/2013 a las 19:31

  • el orden de ejecución es: inicializador estático, inicializador de instancia, constructor

    – Alguien en alguna parte

    19 de febrero de 2014 a las 0:46

  • @SomeoneSomewhere Si bien el “inicializador de instancia, el constructor” se suceden, el “inicializador estático” puede haberse ejecutado mucho antes. Pero tienes razón, el orden es ese, inicialmente. De hecho, es “SI, II, C, II, C, II, C, …”.

    – glglgl

    31 de agosto de 2014 a las 8:34


Bloque estatico en Java duplicate
aiobe

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.

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

Una clase puede tener cualquier cantidad 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 = .... Necesita llamar al método put de alguna manera.

  • @aioobe Entiendo que puede que no sea necesario, pero uno nunca aprenderá sobre los inicializadores estáticos sin estar expuesto a ellos. Además, en algunos casos, se desaconseja la inicialización de miembros de clase en la declaración (algunas empresas para las que trabajé), y la práctica recomendada era inicializarlos dentro de un bloque estático o en el constructor (para miembros no estáticos).

    – Mindwin

    28 de agosto de 2013 a las 19:29

  • Veo. ¿Por qué se desaconseja? Personalmente, encuentro que la inicialización de miembros en la declaración es bastante fácil de leer y mantener. Yo diría que forzarlos en los constructores puede ser una mala idea, especialmente si tiene más de un constructor y necesita repetir la inicialización. (Si, por ejemplo, cambia de ArrayList a LinkedList, debe recordar cambiarlo en varios lugares).

    – aioobe

    28 de agosto de 2013 a las 20:18

  • Como dijiste, necesitamos repetir el código de inicialización en cada constructor. Sería mejor si los inicializamos en los inicializadores de instancia.

    – Técnica Java

    31/10/2013 a las 10:15

  • “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”. el código en el bloque estático debe ejecutarse en primer lugar incluso antes que el constructor de la clase

    – Arno

    07/08/2015 a las 12:55


  • @PhilipRego, el inicializador estático puede ser útil en ciertas situaciones. En una clase anónima, por ejemplo, no hay un constructor para poner la inicialización de la instancia.

    – aioobe

    15 de febrero de 2018 a las 19:01

Bloque estatico en Java duplicate
Simón Lehmann

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 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() {

    }
}

  • Esto parece un normal constructor.

    – Phantommaxx

    14 de junio de 2015 a las 15:08

  • @DerGolem Creo que se refiere a las llaves sobre el constructor normal.

    – Saad

    28 de junio de 2015 a las 16:55

  • Ni siquiera me di cuenta de eso… 😉 ¡Sí, raro!

    – Phantommaxx

    28 de junio de 2015 a las 16:57

1646749877 3 Bloque estatico en Java duplicate
usuario3777803

El bloque estático se puede usar para mostrar que un programa también se puede ejecutar 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); 
    }
}

1646749878 319 Bloque estatico en Java duplicate
Zahid Hussein

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

1646749878 586 Bloque estatico en Java duplicate
SGK

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 brinda una explicación detallada.
http://www.jusfortechies.com/java/core-java/static-blocks.php

1646749879 948 Bloque estatico en Java duplicate
Piyush

sí, el bloque estático se usa para inicializar el código y se cargará en el momento en que JVM comience a ejecutarse.

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

  • no cuando se inicia JVM sino cuando se carga la clase. JVM usa un mecanismo de carga de clases, por lo que carga la clase cuando se usa, no antes y nunca cuando se inicia la JVM.

    – 4lberto

    26 mayo 2015 a las 20:27

  • El bloque estático funciona en todas las versiones de Java. Estoy usando Java 14 y funciona correctamente.

    – Sugat Shivsharan

    30 oct 2021 a las 8:39

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad