Arhiva

Archive for the ‘D'ale SCJP-ului’ Category

Call-by-reference sau call-by-value în Java?

Cei care ați făcut C sau C++ vă aduceți aminte de așa numitele transmiteri de parametri prin valoare sau prin referință. În Java nu există ‘sau’ ci doar call-by-value, indiferent de tipul parametrului.

În momentul în care apelăm o metodă cu parametrii primitivi atunci valoarea lor este transmisă parametrilor formali din metodă. În cazul unor obiecte, valoarea referință este transmisă parametrilor formali și nu obiectul cu totul. Ceea ce înseamnă că și parametrul formal, dar și parametrul inițial din apel vor referenția același obiect din memorie. Acest lucru are cel puțin două consecințe:

  1. Orice modificări făcute asupra stării obiectului referențiat de către parametrul formal, vor fi vizibile și după încheierea apelului metodei;
  2. Dacă modificăm parametrul formal din metodă(deci nu starea obiectului referențiat de el), modificarea nu va fi vizibilă după ieșirea din apel.
   1: public class Test {

   2:     public String rezultat = "bun";

   3:     public Test() {

   4:         System.out.println("Constructor din Test");

   5:     }

   6:     

   7:     public void schimba(Test tst) {

   8:         tst.rezultat = "rau";

   9:         tst = null;

  10:     }

  11:     

  12:     public static void main(String[] args) {

  13:         Test tst = new Test();

  14:         System.out.println(tst.rezultat);

  15:         tst.schimba(tst);

  16:         System.out.println(tst.rezultat);

  17:     }

  18: }

După compilare și rulare, acest program va afișa:

Constructor din Test

bun

rau

La linia 8 se modifică starea obiectului Test referențiat de parametrul formal tst, iar la linia 9 se asociază lui tst valoarea null. Modificarea asupra atributului rezultat se poate observa la ieșirea din apelul metodei schimbă.

Metode cu număr de parametri variabil

Începând cu Java 1.5 a fost introdusă facilitatea de a creea metode cu număr de parametrii variabil. Astfel de metode sunt numite metode cu aritate variabilă și pot permite apeluri cu un număr mai mare de parametri decât parametrii formali din semnătura metodei.

Pentru o metodă cu aritate variabilă, ultimul parametru formal trebuie declarat în felul următor:

<tip>… <nume parametru formal>

Prin urmare, în semnătura unei metode cu aritate variabilă putem avea un singur parametru formal ca mai sus și acesta trebuie să fie ultimul în lista de parametri formali. De asemenea, o altă consecință este că parametrii care pot varia ca număr sunt de același tip.

Parametrul formal ce variază este, de fapt, un array care este umplut cu parametrii dați în plus la apel. Prin urmare, următoarele semnături ale metodei angajare sunt considerate identice:

public void angajare(String… candidati);

public void angajare(String[] candidati);

Dacă cele două semnături sunt considerate identice, în momentul în care am încerca să facem overload la prima formă cu a doua(sau invers), am primi eroare la compilare.

Categories: D'ale SCJP-ului Tags: ,

Declararea și inițializarea de Array

După cum bine se știe un Array, în Java, se poate declara în felul următor:

int[] numere[] = new int[10][10];

Parantezele pătrate se pot pune ori la tipul de date, ori la numele variabilei, ori la amândouă. De asemenea dimensiunea poate lipsi la ultimele dimensiuni ale array-ului. Deci aș fi putut scrie și așa:

int[] numere[] = new int[10][];

Există două modalități de a face declararea și inițializarea unui Array:

  1. int[] numere = new int[] {1, 2, 3, 4};
    Atenție: cand se face inițializarea array-ului nu se mai trece dimensiunea!
  2. int[] numere = {1, 2, 3, 4};
    Acesta este un bloc de inițializare, care poate fi folosit în locul liniei de mai sus, are același efect.

Diferența între cele două modalități este că cea de-a doua nu este o expresie și nu poate fi folosită în felul următor:

int[] numere;

numere = {1, 2, 3, 4}; //nu e ok

numere = new int[] {1, 2, 3, 4}; //e ok

Categories: D'ale SCJP-ului Tags: , ,

Tipul Enum* (java.lang.Enum)

Câte ceva despre tipul Enum:

  • un tip care conține un set de constante;
  • un tip enum poate avea constructori, dar aceștia trebuie declarați după definirea constantelor și pot fi doar private;
  • toate enum-urile sunt subtipuri ale clasei java.lang.Enum, prin urmare sunt comparabile și serializabile;
  • la definirea constantelor se poate specifica o listă de parametri pentru fiecare, iar la încărcarea enum-ului pentru fiecare constantă se va apela constructorul corespunzător semnăturii ei;
  • un enum poate fi declarat în cadrul unei alte clase, dar doar ca membru de prim nivel sau în cadrul unui membru static; toate enum-urile declarate în cadrul unei alte clase sunt implicit statice;
  • deși un enum poate coține diferite metode abstracte, tipul nu va fi marcat ca și abstract, ca în cazul claselor obișnuite;
  • fiecare constantă a unui enum poate implementa diferite metode specifice, sub forma unor clase anonime care sunt instanțiate la “runtime”;
  • un enum poate implementa interfețe dar nu poate extinde;
  • Compararea cu == sau cu equals este echivalentă în cazul constantelor unui enum;

*Conform Java 1.6

Categories: D'ale SCJP-ului Tags: , ,