java static-block initialization-block

Bloque estático vs. bloque inicializador en Java?



static-block initialization-block (2)

El bloque estático se ejecuta cada vez que se carga tu clase. El bloque vacío se ejecuta cada vez que crea una instancia de su clase. Intente comparar estos:

1.

public static void main(String[] args) { Test t = new Test(); }

2.

public static void main(String[] args) { }

Productos:

1.

Bloque estático
Bloque vacío

2.

Bloque estático

En palabras de Layman, el bloque estático solo recibe una llamada una vez , independientemente de cuántos objetos de ese tipo cree.

Posible duplicado:
Bloques de inicialización estática

Considera el siguiente código :

public class Test { { System.out.println("Empty block"); } static { System.out.println("Static block"); } public static void main(String[] args) { Test t = new Test(); } }

Entendemos que primero se ejecutará el bloque estático seguido del bloque vacío . Pero el problema es que nunca he sido capaz de comprender la utilidad real de un bloque vacío . ¿Alguien puede mostrar un ejemplo real en el que -

  • Se están usando bloques estáticos y vacíos
  • Ambos bloques estáticos y vacíos tienen diferentes utilidades

Son para dos propósitos muy diferentes:

  • El bloque de inicializador estático será invocado al cargar la clase, y no tendrá acceso a variables o métodos de instancia. Según el comentario de @Prahalad Deshpande, a menudo se usa para crear variables estáticas.
  • El bloque de inicializador no estático, por otro lado, se crea solo en la construcción de objetos, tendrá acceso a variables y métodos de instancia, y (según la corrección importante sugerida por @EJP) se llamará al principio del constructor, después del se ha llamado al super constructor (explícita o implícitamente) y antes de llamar a cualquier otro código de constructor posterior. Lo he visto usar cuando una clase tiene múltiples constructores y necesita el mismo código de inicialización llamado para todos los constructores. Al igual que con los constructores, debe evitar llamar a métodos no finales en este bloque.

Tenga en cuenta que esta pregunta ha sido respondida muchas veces en y haría bien en buscar y revisar las preguntas similares y sus respuestas. Por ejemplo: static-initialization-blocks