Orden de ejecución de Bloques de Inicialización y Constructores en Java

Requisito previo: bloques estáticos , bloque de inicialización , constructor
En un programa Java, las operaciones se pueden realizar en métodos, constructores y bloques de inicialización.
Bloques de inicialización de instancia: IIB se utilizan para inicializar variables de instancia. Los IIB se ejecutan antes que los constructores. Se ejecutan cada vez que se crea el objeto de la clase.
Bloque inicializador: contiene el código que siempre se ejecuta cada vez que se crea una instancia. Se utiliza para declarar/inicializar la parte común de varios constructores de una clase.
Constructores :se utilizan para inicializar el estado del objeto. Al igual que los métodos, un constructor también contiene una colección de declaraciones (es decir, instrucciones) que se ejecutan en el momento de la creación del objeto.

Orden de ejecución de bloques de Inicialización y constructor en Java

  1. Los bloques de inicialización estática se ejecutarán siempre que la clase se cargue por primera vez en JVM
  2. Los bloques de inicialización se ejecutan en el mismo orden en que aparecen en el programa.
  3. Los bloques de inicialización de instancias se ejecutan cada vez que se inicializa la clase y antes de que se invoquen los constructores. Por lo general, se colocan sobre los constructores entre llaves.
// Java code to illustrate order of
// execution of constructors, static
// and initialization blocks
class GFG {
  
    GFG(int x)
    {
        System.out.println("ONE argument constructor");
    }
  
    GFG()
    {
        System.out.println("No  argument constructor");
    }
  
    static
    {
        System.out.println("1st static init");
    }
  
    {
        System.out.println("1st instance init");
    }
  
    {
        System.out.println("2nd instance init");
    }
  
    static
    {
        System.out.println("2nd static init");
    }
  
    public static void main(String[] args)
    {
        new GFG();
        new GFG(8);
    }
}

Producción

1st static init
2nd static init
1st instance init
2nd instance init
No  argument constructor
1st instance init
2nd instance init
ONE argument constructor

Nota: si hay dos o más bloques estáticos/inicializadores, se ejecutan en el orden en que aparecen en el código fuente.

Ahora, prediga la salida del siguiente programa:

// A tricky Java code to predict the output
// based on order of 
// execution of constructors, static 
// and initialization blocks
class MyTest {
    static
    {
        initialize();
    }
      
    private static int sum;
      
    public static int getSum()
    {
        initialize();
        return sum;
    }
  
    private static boolean initialized = false;
  
    private static void initialize()
    {
        if (!initialized) {
            for (int i = 0; i < 100; i++)
                sum += i;
            initialized = true;
        }
    }
}
  
public class GFG {
    public static void main(String[] args)
    {
        System.out.println(MyTest.getSum());
    }
}

Producción:

9900

Explicación:

  • El bucle en la función de inicialización va de 0 a 99. Con eso en mente, podría pensar que el programa imprime la suma de los números de 0 a 99. Por lo tanto, la suma es 99 × 100 / 2, o 4, 950. Sin embargo, el programa , piensa lo contrario. Imprime 9900 , el doble de este valor.
  • Para comprender su comportamiento, sigamos su ejecución. El método GFG.main invoca MyTest.getSum. Antes de que se pueda ejecutar el método getSum, la máquina virtual debe inicializar la clase MyTest. La inicialización de clase ejecuta inicializadores estáticos en el orden en que aparecen en la fuente.
  • La clase MyTest tiene dos inicializadores estáticos: el bloque estático en la parte superior de la clase y la inicialización del campo estático inicializado. El bloque aparece primero. Invoca el método initialize, que prueba el campo inicializado. Como no se ha asignado ningún valor a este campo, tiene el valor booleano predeterminado falso.
  • De manera similar, sum tiene el valor int predeterminado de 0. Por lo tanto, el método de inicialización hace lo que cabría esperar, sumando 4950 a sum y configurando initialized como verdadero. Después de que se ejecuta el bloque estático, el inicializador estático para el campo inicializado lo vuelve a establecer en falso, completando la inicialización de clase de MyTest. Desafortunadamente, sum ahora contiene el 4950, pero inicializado contiene false.
  • El método principal en la clase GFG luego invoca MyTest.getSum, que a su vez invoca el método initialize. Debido a que el indicador inicializado es falso, el método initializeIf ingresa en su bucle, que agrega otros 4950 al valor de sum, aumentando su valor a 9900. El método getSum devuelve este valor y el programa lo imprime
  • Este artículo es una contribución de Shubham Juneja . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo usando contribuya.geeksforgeeks.org o envíe su artículo por correo a contribuya@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.

    Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *