marți, 5 februarie 2019

Blocuri de inițializare în Java

În Java o variabilă poate fi inițializată prin următoarele modalități: 


1) La declarare 

2) Cu ajutorul unei metode ( fie constructor fie nu) 

3) Cu ajutorul blocurilor de inițializare 

Un bloc de inițializare este un bloc de cod definit între { și }, asemănător cu blocuri/corpuri de metode, principala diferență fiind, blocurile de inițializare nu au un nume. Ele sunt ca metodele, însă fără antet/header (tip returnat, nume metoda, lista de parametri). 

Deoarece în Java nu există cod înafara clasei, blocurile de inițializare vor fi la rândul lor definite în interiorul unei clase. 

Blocurile de inițializare sunt de 2 tipuri: 

Nestatice - blocuri de cod care sunt executate de fiecare dată când o instanță a clasei este creată, adică în cazul în care constructorul este apelat. Aceste blocuri de inițializare urmăresc inițializări de atribute statice ce trebuie executate de fiecare dată când se construiește un obiect indiferent de constructorul apelat. Blocurile instanță (nestatice) de inițializare pot accesa atribute statice și variabile de instanță. 

Exemplul_1:

public class Exemplu_1
{ // Bloc de initializare nestatic (instanta)
  {
   System.out.println("Bloc initializare nestatic invocat  !!");
  }
  public Exemplu_1(){
   System.out.println("Constructor default!!!");
  }
  public Exemplu_1(int x){
   System.out.println("Constructor parametrizat!!!");
  }
  public static void main(String [] args){
    Exemplu_1 ob1, ob2;
    ob1 = new Exemplu_1();
    ob2 = new Exemplu_1(0);
  }
}


Statice - blocuri de cod care sunt executate DOAR O DATA atunci când clasa este încărcată de Java Virtual Machine. Aceste tipuri de blocuri de inițializare sunt utile pentru inițializarea atributelor statice din clase sau pentru a efectua o singura data un set de prelucrări. Blocurile statice de inițializare pot accesa DOAR atributele statice ale clasei în care sunt definite. NU se pot folosi variabile de instanță în blocuri de inițializare statice (dacă încercați să faceți acest lucru veți primi o eroare de compilare: non-static variable value cannot be referenced from a static context).

Exemplul_2:

public class Exemplu_2
{ // Bloc de initializare static
  static {
   System.out.println("Bloc initializare static invocat  !!");
  }
  public Exemplu_2(){
   System.out.println("Constructor default!!!");
  }
  public Exemplu_2(int x){
   System.out.println("Constructor parametrizat!!!");
  }



  public static void main(String [] args){
    Exemplu_2 ob1, ob2;
    ob1 = new Exemplu_2();
    ob2 = new Exemplu_2(0);
  }
}





Se poate defini atât de multe blocuri de inițializare (statice sau nu) de câte este nevoie, dar trebuie sa se acorde atenție ordinii lor de definire, deoarece aceasta este și ordinea lor de execuție !