Les blocs d'initialisation en java

L’intérêt d’écrire des blocs initialisation est de pouvoir initialiser les valeurs  lors du chargement de la classe ainsi  lors de l'instanciation,il y a bien une différence entre le chargement et l'instanciation des classes sur JAVA.
L'initialisation de la classe est faite lorsque une nouvelle instance a été crée dans la mémoire,par contre le chargement de la classe est fait au début lorsqu'on  définit un nouvel objet sans le mot clé new.

Chargement de la classe :
Client client;
Creation ou l'instanciation de la classe :
client = new Client();

Revenons a notre sujet,autour des blocs initialisation, ils permettent initialiser les valeurs appartenant a la classe , il y a deux types :

I-Les blocs d'initialisation static :
Ces blocs s’exécutent une seule fois lors du chargement de la classe et ne s’exécutent pas lors des instanciation de la classe ,ils sont lancés avant l'appel des constructeurs.
On peut créer des blocs static comme ceci :

static { ...  }

Au chargement de la classe, les blocs d'inialisation static s'executent suivant l'ordre d'ecriture dans n'importe quel ligne dans la classe.

Exemple :

public class Compte{
Compte(){  System.out.println("constructeur sans arguments");}
static{  System.out.println("Bloc static d'initialisation 1");}
static{  System.out.println("Bloc static d'initialisation 2");}
public static void main (String args[]) {
new Compte();
}
}

la sortie de ce programme est :
Bloc static d'initialisation 1
Bloc static d'initialisation 2
constructeur sans arguments

>> On remarque que les blocs static sont lancés avant le constructeur.

II-Les blocs initialisation d'instance :
ils se déclarent entre deux crochets{} sans le mot clé static et  s’exécutent lors de l'instanciation ou la création d'une nouvelle instance de la classe,ils s’exécutent un par un suivant l'ordre définie dans la classe ainsi qu'apres le lancement des constructeurs.
On prendra l'exemple de la classe Client, en ajoutant les blocs d'instances :

public class Compte{
Compte(){  System.out.println("constructeur sans arguments");}
{  System.out.println("Bloc instance 1");}
static{  System.out.println("Bloc static d'initialisation 1");}
{  System.out.println("Bloc instance  2");}
static{  System.out.println("Bloc static d'initialisation 2");}
public static void main(String args[]) {
new Compte();
}
}

Lançons ce programme et regardons le résultat :
Bloc static d'initialisation 1
Bloc static d'initialisation 2
Bloc instance 1
Bloc instance  2
constructeur sans arguments

On remarque bien que les blocs d'instances sont exécutés après le constructeur.et les blocs static sont lancés au début lors du chargement de la classe.

Ce que vous devez retenir :
  • Les blocs initialisation s’exécute suivant l'ordre définie.
  • Les  blocs static s’exécutent avant les blocs d'instance et avant les constructeurs.
  • Les blocs static s’exécutent lors du chargement de la classe,une fois pour toute.
  • Les blocs d'instances s’exécutent avant les constructeurs
  • Les blocs d'instances s’exécutent a chaque instanciation ou création de la classe.