Sunteți pe pagina 1din 4

Programarea Orientată spre Obiecte, Limbajul Java, 2019-2020 CEITI

Tema2. Constructori. Tipuri de constructori. Garbage Collector.

Garbage Collector – Distrugerea obiectelor


În Java programatorul nu are responsabilitatea distrugerii obiectelor deoarece în momentul rulării unui
program simultan cu interpretorul Java rulează şi un proces ce se ocupă de distrugerea obiectelor care
nu mai sunt folosite. Acest proces se numește Garbage Collector (colector de gunoi, GC).
Un obiect este eliminat din memorie de procesul de colectare atunci când nu mai există nici o referinţă
la aceasta.
Referințele, care sunt de fapt variabile, sunt distruse în 2 moduri:
 implicit (atunci când variabila iese din domeniul sau de vizibilitate, de ex. la terminarea metodei
în care a fost declarată)
 explicit ( atunci când atribuim variabilei respective valoare null).
Colectorul de gunoaie este un proces de prioritate scăzută care se execută periodic și marchează acele
obiecte care au referinţe directe sau indirecte. După ce toate obiectele au fost parcurse, cele care au
rămas nemarcate sunt eliminate automat din memorie. Apelul metodei gc() din clasa System
sugerează mașinii virtuale Java să “depună eforturi” în recuperarea memoriei ocupate de obiecte care
nu mai sunt folosite.

Ce sunt constructorii claselor ?


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 lor.
Rețineți!  De fiecare dată când este creat un obiect este apelat un costructor;
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 compliatorul va oferi
un constructor implicit cu 0 argumente, care va avea forma:
public numeClasă(){...}
 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ă să nu fie constructori, de exemplu:
public class carte {
public void Carte(){System.out.print(“metoda simplă”); }
}
 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;
 În interiorul constructorului poate fi utilizată referința this , 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:
opreavictoria86@gmail.com © MUSTEAȚĂ Victoria
1
Programarea Orientată spre Obiecte, Limbajul Java, 2019-2020 CEITI
public class carte{
float pret;
String titlu, autor;
public carte(float pret, String titlu, String autor){
this.pret=pret;
this.titlu=titlu;
this.autor=autor; }
}
 Pentru a apela un constructor al super clasei se folosi cuvântul chee super.
 Constructorii NU pot fi moşteniţi.

Tipuri de constructori
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.
public class unu {
public static void main(String[] args) {
unu obiect=new unu();
}
}
Notă! În cazul în care veți declara un constructor, constructorul default nu va fi generat.
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.
public class unu {
unu(){
System.out.println("Acesta NU este constructor implicit!");
}
public static void main(String[] args) {
unu obiect=new unu();
}}
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.
public class Elev {
String nume;
int virsta;
Elev(String nume, int virsta){
this.nume=nume;
this.virsta=virsta;
}
public static void main(String[] args) {
Elev e1= new Elev("Ion",18);
System.out.println(e1.nume+" "+e1.virsta);
}}

opreavictoria86@gmail.com © MUSTEAȚĂ Victoria


2
Programarea Orientată spre Obiecte, Limbajul Java, 2019-2020 CEITI
public class Elev {
String nume;
int virsta;
Elev(String nume){
this.nume=nume;
}
public static void main(String[] args) {
Elev e1= new Elev("Ion");
e1.virsta=18;
System.out.println(e1.nume+" "+e1.virsta);
}}

Cum supraîncărcăm constructorii?


Procesul de definirea constructorilor cu liste de parametri diferiți în cadrul unei clase se numește
supraîncărcarea (overload) constructorului.
Fie că avem de definit o clasă ce va duce evidența persoanelor caracterizate prin : nume, prenume și
vîrstă. Creați clasa dată și supraîncărcați constructorul clasei de 3 ori.
class Persoana {
String nume, prenume;
int virsta;
Persoana(){}
Persoana (String nume){
this.nume = nume;
}
Persoana (String nume, String prenume){
this.nume = nume;
this.prenume = prenume;
}
Persoana (String nume, String prenume, int virsta){
this.nume = nume;
this.prenume = prenume;
this.virsta = virsta;
}}

Când utilizăm varabila predefinită ,,this”?


Variabila predefintă this este de tipul referință către clasa în interiorul căreia apare metoda.
Folosim this:
1) acolo unde ar putea exista conflicte de nume cu datele membru ale unui obiect.
De exemplu:
class Cerc{
int r;
public Cerc(int r){
this.r=r;
}
2) atunci când o referinţă la obiectul receptor trebuie transmisă ca parametru la apelul unei alte
metode:
De exemplu:

opreavictoria86@gmail.com © MUSTEAȚĂ Victoria


3
Programarea Orientată spre Obiecte, Limbajul Java, 2019-2020 CEITI
class Punct {
int x,z;
public Punct(Punct p)
this.x=p.x;
this.y=p.y;
}
3) apelăm un constructor din interiorul aceleiași clase:
public class Elev {
String nume;
int virsta;
Elev(String nume){
this.nume=nume;
}
Elev(String nume, int virsta){
this(nume);
this.virsta=virsta;
}
public static void main(String[] args) {

Elev e1= new Elev("Ion");


e1.virsta=18;
System.out.println(e1.nume+" "+e1.virsta);

Elev e2= new Elev("Mihai",20);


System.out.println(e2.nume+" "+e2.virsta);
}}
Exercițiu

Creaţi clasa Elev care va avea ca atribute: Nume, Prenume, Patronimic, Virsta, Gen, nrAbsente, notaMedie, şi ca metode:
- cîte o metodă de setare a valorii(de tipul setNume(...)) pentru fiecare atribut al clasei;
- cîte o metodă de obţinere a valorii(de tipul getNume(...)) pentru fiecare atribut al clasei;
- metoda purtare() care va determina purtarea elevului în dependenţă de numărul de absenţe :
 dacă elevul are mai mult de 30 absenţe atunci are purtarea satisfăcătoare;
 dacă elevul are de la 20 la 30 absenţe atunci are purtarea bună;
 dacă elevul are de la 8 la 20 de absenţe atunci are purtarea foarte bună;
 dacă elevul are de la 0 la 8 absenţe atunci are purtarea excelentă;
- metoda bursa() care va calcula bursa elevului în dependenţă de nota medie a acestuia în felul următor:
 dacă notaMedie <5 , atunci Bursa=0(lei);
 dacă 5≤ notaMedie <7 , atunci Bursa=100(lei);
 dacă 7≤ notaMedie <8 , atunci Bursa=20*nm(lei);
 dacă 8≤ notaMedie <10 , atunci Bursa=25*nm(lei);
 dacă notaMedie =10 , atunci Bursa=300(lei);
- metoda main(...) în care instanţiaţi 10 obiecte pentru această clasă şi testaţi pentru fiecare obiect toate metodele
programate.
Surse:
1. http://www.itcsolutions.eu/2011/06/12/tutorial-java-scjp-16-constructori/
2. http://www.ctvuct.ro/Public/Cursuri%20de%20programare/Curs%20JAVA/Curs%202.pdf
3. http://www.geeksforgeeks.org/g-fact-79/

opreavictoria86@gmail.com © MUSTEAȚĂ Victoria


4