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 implicitm.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.
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:
Notă! În cazul în care veți declara un constructor, constructorul default NU va fi generat.class Masina{int nrUsi;}public class Main{public static void main(String[] args) {Masina m = new Masina(); //constructor implicitm.nrUsi = 4;System.out.println("Masina are "+ m.nrUsi + " usi!");}}
class Masina{int nrUsi;Masina(int x){nrUsi = x;}}public class Main{public static void main(String[] args) {Masina m = new Masina(); //eroarem.nrUsi = 4;System.out.println("Masina: culoare "+ 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(){ 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!");}}
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.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!");}}
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!");}}
Î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) î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.