Se afișează postările cu eticheta constructor. Afișați toate postările
Se afișează postările cu eticheta constructor. Afișați toate postările

duminică, 14 ianuarie 2024

Constructori în limbajul JAVA

Constructorii unei clase sunt metode speciale care au același nume ca și clasa, nu returnează nici o valoare și sunt folosiți pentru inițializarea obiectelor acelei clase în momentul instanțierii acestora.

Rețineți!
  • De fiecare dată când este creat un obiect este apelat un constructor;
Elev elev1 = new Elev();
  • Corpul constructorului este format din instrucțiuni care se execută la crearea unui nou obiect al clasei respective;
  • Fiecare clasă Java are cel puțin un constructor;
  • Dacă nu există declarați în mod explicit alți constructori atunci compilatorul va oferi un constructor implicit cu 0 argumente, care va avea forma:
public numeClasa(){
}
  • Constructorii au același nume (case-sensitive) ca și clasa acestuia;
  • Constructorii NU au tip de return. Putem avea definite metode cu același nume ca și clasa însă NU sunt constructori, de exemplu:
class Masina{
   int nrUsi;
   void Masina(int x){
        nrUsi = x;
    }}
public class Main{
    public static void main(String[] args) {
        Masina m = new Masina(); //constructor implicit
        m.Masina(4);
        System.out.println("Masina are"+ m.nrUsi + " usi!");
}}
  • Constructorii pot avea orice nume de argumente şi o clasă poate avea orice număr de constructori;
  • Dacă specificăm explicit un constructor atunci compilatorul va anula constructorul implicit, nu îl va mai genera, de aceea va trebui și pe acesta să îl definim;
  • Constructorul NU poate fi static, final sau abstract;
  • Pentru a apela un constructor al superclasei se folosi cuvântul cheie super.
  • Constructorii NU pot fi moșteniți.
În Java, există mai multe tipuri de constructori, în funcție de modul în care aceștia sunt declarați și folosiți:

a) Constructor implicit – este generat automat de compilator în cazul în care programatorul nu a definit un constructor. Acesta nu conține cod în interior. Așa tip de constructor nu îl veți găsi în cod deoarece acesta este creat în momentul compilării și inclus în fișierul cu extensia
.class:

De exemplu:

class Masina{
    int nrUsi;
}
public class Main{
 public static void main(String[] args) {
   Masina m = new Masina(); //constructor implicit
    m.nrUsi = 4;
System.out.println("Masina are "+ m.nrUsi + " usi!");
}}
Notă! În cazul în care veți declara un constructor, constructorul default NU va fi generat.
class Masina{
    int nrUsi;
    Masina(int x){
        nrUsi = x;
    }
}
public class Main{
    public static void main(String[] args) {
        Masina m = new Masina(); //eroare
        m.nrUsi = 4;
        System.out.println("Masina: culoare "+ m.nrUsi + " usi!");
}}
b) Constructor fără parametri – este scris de către programator și nu conține argumente, mai este numit constructor no-arg. Semnătura este aceeași cu cea a constructorului implicit, însă corpul poate avea orice cod, spre deosebire de constructorul implicit, unde corpul constructorului este gol.
class Masina{
    int nrUsi;
    Masina(){ System.out.println("Acesta NU este constructor implicit!");
    }
}
public class Main{
    public static void main(String[] args) {
        Masina m = new Masina();
        m.nrUsi = 4;
        System.out.println("Masina are"+ m.nrUsi + " usi!");
 }}
c) Constructor parametrizat – este scris de programator și poate conține orice număr de parametri sau argumente. Se utilizează pentru a inițializa datele unui obiect.

class Masina{
  int nrUsi;
  Masina(int x){
    nrUsi = x;
    }
}
public class Main{
  public static void main(String[] args) {
    Masina m = new Masina(4);
    System.out.println("Masina are " + m.nrUsi + " usi!");
  }}
Este posibil ca în interiorul clasei să fie folosită variabila predefinită this care face referire la obiectul curent al clasei, mai jos vom explica și alte aspecte legate de această variabilă. Dar în contextul exemplului de mai sus observăm că argumentul costructorului are un identificator diferit de atributul clasei, dar sunt cazuri în care acestea pot avea același identificator.
Pentru a diferenția atributul clasei de argumentul constructorului se folosește this, ca în exemplul de mai jos:

class Masina{
    int nrUsi;
    Masina(int nrUsi){
        this.nrUsi = nrUsi;
    }
}
public class Main{
    public static void main(String[] args) {
        Masina m = new Masina(4);
        System.out.println("Masina are " + m.nrUsi + " usi!");
  }}
Deci, la atributul clasei i se atribuie argumentul constructorului, și nu invers!!!!


În cadrul unei clase pot fi definiți constructori cu listă diferită de parametri.
De exemplu:
class Masina{
int nrUsi;
String culoare;
String marca;
Masina(){
}
Masina(int nrUsi){
this.nrUsi = nrUsi;
}
Masina(String culoare){
this.culoare = culoare;
}
Masina(int nrUsi, String culoare,String marca){
this.nrUsi = nrUsi;
this.culoare = culoare;
this.marca = marca;
}
}
public class Main{
public static void main(String[] args) {
Masina m1 = new Masina(4);
System.out.println("Masina 1 are " + m1.nrUsi + " usi si culoare "+ m1.culoare);
Masina m2 = new Masina("rosie");
System.out.println("Masina 2 are " + m2.nrUsi + " usi si culoare "+ m2.culoare);
Masina m3 = new Masina(2,"rosie","BMW");
System.out.println("Masina 3 are " + m3.nrUsi + " usi si culoare "+ m3.culoare +
" marca"+m3.marca);
}}
  
Așa tip de constructori se numesc supraîncărcați. Fiți atenți în utilizarea acestor constructori, fiecare are destinația sa, primul va inițializa doar numărul de uși restul atributelor clasei vor fi inițializate cu valori default după cum urmează: atributele de tip String vor fi inițializate cu valoarea null, cele de tip întreg cu valoarea 0, cele boolean cu valoarea false, iar cele reale cu valoarea 0.0.

Variabila predefinită this are în linii generale trei utilizări în cadrul clasei și anume:

a) în interiorul constructorului, pentru a face diferență dintre variabilele instanță și cele locale (de metodă) dacă acestea au aceeași denumire sau pentru a referi obiectul construit.

De exemplu:




b) atunci când o referință la obiectul receptor trebuie transmisă ca parametru la apelul unei alte metode. 
De exemplu:


c) pentru a apela un constructor din interiorul aceleiași clase: