I blocchi di inizializzazione sono parti di codice anonime racchiuse tra parentesi graffe ed eseguite, a seconda del loro tipo, in fase di caricamento della classe o in fase di creazione di un oggetto della classe.
Nel primo caso si parla di blocchi di inizializzazione statici, mentre nel secondo caso di blocchi di inizializzazione di istanza.
Ci sono diversi criteri che determinano l’ordine di esecuzione dei blocchi di inizializzazione:
- I blocchi statici vengono eseguiti prima dei blocchi di istanza.
- I blocchi dello stesso tipo vengono eseguiti in base all’ordine in cui compaiono all’interno della classe.
- I blocchi statici vengono eseguiti una sola volta al caricamento della classe, mentre i blocchi di istanza vengono eseguiti ogni volta che viene creato un oggetto della classe
- I blocchi di istanza vengono eseguiti nel costruttore della classe subito dopo la chiamata super al costruttore della classe padre
- I blocchi statici della classe padre vengono eseguiti prima dei blocchi statici delle sottoclassi
public class OCAJP7Certification { public OCAJP7Certification() { System.out.println("Constructor"); } static { System.out.println("Static Block"); } public static void main(String[] args) { OCAJP7Certification oca = new OCAJP7Certification(); } { System.out.println("Instance Block"); } }
OUTPUT:
Static Block Instance Block Constructor
public class OCAJP7Certification { public OCAJP7Certification() { System.out.println("Constructor"); } static { System.out.println("Static Block 1"); } public static void main(String[] args) { OCAJP7Certification oca = new OCAJP7Certification(); } { System.out.println("Instance Block 1"); } { System.out.println("Instance Block 2"); } static { System.out.println("Static Block 2"); } }
OUTPUT:
Static Block 1 Static Block 2 Instance Block 1 Instance Block 2 Constructor
public class OCAJP7Certification { public OCAJP7Certification() { System.out.println("Constructor"); } static { System.out.println("Static Block"); } public static void main(String[] args) { OCAJP7Certification oca1 = new OCAJP7Certification(); OCAJP7Certification oca2 = new OCAJP7Certification(); OCAJP7Certification oca3 = new OCAJP7Certification(); } { System.out.println("Instance Block"); } }
OUTPUT:
Static Block Instance Block Constructor Instance Block Constructor Instance Block Constructor
class BaseClass { public BaseClass() { System.out.println("Base Class Constructor"); } } public class OCAJP7Certification extends BaseClass { public OCAJP7Certification() { System.out.println("Constructor"); } static { System.out.println("Static Block"); } public static void main(String[] args) { OCAJP7Certification oca = new OCAJP7Certification(); } { System.out.println("Instance Block"); } }
OUTPUT:
Static Block Base Class Constructor Instance Block Constructor
class BaseClass { public BaseClass() { System.out.println("Base Class Constructor"); } static { System.out.println("Base Class Static Block"); } } public class OCAJP7Certification extends BaseClass { public OCAJP7Certification() { System.out.println("Constructor"); } static { System.out.println("Static Block"); } public static void main(String[] args) { OCAJP7Certification oca = new OCAJP7Certification(); } { System.out.println("Instance Block"); } }
OUTPUT:
Base Class Static Block Static Block Base Class Constructor Instance Block Constructor