Sunteți pe pagina 1din 22

CONSTRUCTORII ÎN JAVA

NOȚIUNI DE BAZĂ A CONSTRUCTORILOR

• Constructorii din Java sunt tipuri speciale de metode care sunt utilizate pentru
inițializarea obiectelor clasei.
• De fiecare data când este creat un obiect, este apelat un constructor. Pornind de la
aceasta certitudine, în Java, fiecare clasa are cel puțin un constructor, chiar daca
programatorul nu a declarat în mod explicit unul.

• Rolurile funcției constructor sunt:

• Rolul principal – pentru a construi obiecte, in sensul de a aloca spațiu în Heap;


• Rol secundar [opțional] – pentru a inițializa variabilele de instanța (atribute) cu valori
default (amintiți-va, ca variabilele de instanța primesc valoarea implicita a tipului lor
atunci când obiectul este creat) sau cu valori date;
SINTACSA
• Sintaxă

• public class NewClass() // name of the class


• {
• ....
• NewClass() // this is Constructor with the same name of class
• {
• ...
• ...
• }
• new NewClass(); // object creation and value initialization
• }
EXEMPLU

• Avand în vedere clasa Carte si metoda main():


• public class Carte {
• float pret;
• String titlu;
• String autor;
• public static void main(String[] args)
• {
• //construieste un obiect de tip Carte
• Carte c1 = new Carte();
• }
• }
• este clar ca in metoda main() este construit un obiect de tip Carte, ce este gestionat de referinta c1.
CONCTRUCTOR IMPLICIT
• O regula în ceea ce privește constructorii afirma ca, compilatorul va oferi un
constructor implicit (unul cu zero argumente) daca nu exista declarați in mod explicit
alți constructori. Forma constructorului implicit, generat de compilator, este:

• public Constructor()
• {

• }
REGULI PENTRU A DECLARA SI APELA
CONSTRUCTORI IN JAVA

• constructorii au același nume (case-sensitive), ca si clasa părinte;

• constructori nu au un tip de return (este logic, deoarece vor întoarce întotdeauna o


referința către obiectul construit); ATENTIE pot fi definite metode cu același nume
ca si clasa, dar cu un tip de return care sunt metode comune si NU constructori;
EXZEMPLU
• public class Carte {
• //NU este un constructor - are tip returnat
• public void Carte(){
• System.out.println("O metoda simpla fara logica !");
• }
• public static void main(String[] args)
• {
• //construieste un obiect de tip Carte cu constructorul default
• Carte b1 = new Carte();
• b1.Carte(); //apel metoda simpla - NU constructor
• }
• }
REGULI
• constructori pot fi declarați public sau privat (specific pentru un Singleton – design
pattern);

• constructori pot avea zero argumente (constructor fără paramenri), unele


argumente si liste variabile de argumente (var-args);
• //constructor fara argumente EXEMPLU
• public Carte(){
• pret = 100;
• titlu = "Nimic";
• autor= “nu este” }
• //constructor cu 3 argumente
• public Carte(float Pret, String Titlu, String Autor){
• pret = Pret;
• titlu = Titlu;
• autor= Autor; }
• //constructor cu 2 argumente
• public Carte(String Titlu, String Autor){
• pret = 0; //valoare default
• titlu = Titlu;
• autor= Autor; }
• //constructor cu numar variabil de argumente - var-args
• public Carte(float Pret, String ... nisteStrings){
• //procesare date }
REGULI
• constructorul implicit este unul cu zero-argumente;
• daca nu se scrie ORICE tip de constructor, compilatorul va genera forma implicita;
• daca se definește cel puțin un constructor (nu contează argumentele sale),
compilatorul NU va genera forma implicita;
• daca se definește cel puțin un constructor (cu parametri) si este nevoie de cel
implicit, acesta trebuie definit in mod explicit; in caz contrar se obține o eroare de
compilare atunci când acesta este apelat;
• constructori NU poate fi static , final sau abstract ;
• in interiorul unui constructor puteți utiliza referința this pentru a se referi obiectul
construit.
• public class Carte {
EXEMPLU
• float pret;
• String titlu;
• String autor;

• //constructor cu 2 argumente
• public Carte(String Titlu, String Autor){
• pret = 0; //valoare default
• titlu = Titlu;
• autor = Autor;
• //Carte(){}
• }
• public static void main(String[] args){
• //construieste o Carte
• Carte b=new Carte(“Pupăza”, “Creangă”);
• //cannot find symbol : constructor Carte()
• Carte b1 = new Carte(); //eroare compilare
• }}
EXEMPLU

• public Carte(float Pret, String titlu, String Autor){


• this.pret = Pret; //this este optional
• this.titlu = titlu; //TREBUIE folosit this
• autor = Autor;
• }
REGULI

• prima declarație intr-un constructor este un apel la un alt constructor folosind


this(), sau pentru un constructor din superclasa (clasa de baza daca aceasta este o
subclasa) folosind super() (mai mult pe acest subiect, in moștenire);

• daca nu utilizați nici this() sau super() , compilatorul va face implicit apelul către
super(), pentru a înțelege cine este super(), trebuie sa cunoașteți conceptul de
moștenire:
EXEMPLU
• //constructor cu 2 argumente
• public Carte(String Titlu, String Autor){

• //generat de compilator daca nu este apelat explicit

• //super();

• //in acest exemplu apeleaza constructorul clasei Object
• //in Java, toate clasele sunt derivate implicit din Object

• pret = 0; //valoare default


• titlu = Titlu;
• autor = Autor;
• }
EXEMPLU

• //constructor cu 3 argumente
• public Carte(float Pret, String Titlu, String Autor){
• //apel explicit al constructorului cu 2 argumente
• //TREBUIE sa fie prima instructiune
• //fara el, compilatorul apeleaza super();

• this(Titlu, Autor);

• pret = Pret;
• }
EXEMPLU
• un constructor este apelat cu operatorul new sau folosind this() intr-un alt
constructor; nu este permis apelul constructorilor folosind sintaxa aferenta pentru
orice alta metoda:

• Carte myCarte = new Carte(23,"Dune","Frank Herbert"); //ok



• Carte(23,"Dune","Frank Herbert"); //eroare compilare

• myCarte.Carte(23,"Dune","Frank Herbert"); //eroare compilare


ATENȚIE
• cand se apeleaza alti constructori cu this() evitati apeluri incrucisate (cross-calls)
care pot genera recursivitate infinita si exceptie la executie de tip
StackOverflowError (unele compilatoare pot identifica problema si pot genera o
eroare de tip recursive constructor invocation):

• public Carte(String Titlu, String Autor){
• this(0,Titlu, Autor); //apeleaza constructorul cu 3 argumente
• }
• //constructor cu 3 argumente
• public Carte(float Pret, String Titlu, String Autor){
• this(Titlu, Autor); //apeleaza constructorul cu 2 argumente
• //TREBUIE sa fie prima instructiune
• pret = Pret;
• }
REGULI
• constructori au acces la metode si variabile statice – definite cu static;

• clasele abstracte pot avea constructori;

• atunci cand se supraincarca constructori (metode de definire cu acelasi nume, dar


cu liste diferite de parametri), trebuie definiti cu liste diferite de parametri (ca numar
sau ca tip);
• public class Carte {
SARCINĂ
• float pret;
• String titlu;
• String autor;
• public Carte(){
• pret = 100;
• titlu = "Nimic";
• autor = "Anonim";
• System.out.println("pret "+pret+" titlu "+ titlu+" autor "+autor);
• }
• public Carte(String Titlu, String Autor){
• this();
• pret = 0; //valoare default
• titlu = Titlu;
• autor = Autor;
• System.out.println("pret 1 "+pret+" titlu 1 "+ titlu+" autor 1 "+autor);
• }
• public static void main(String[] args){
• Carte primaCarte = new Carte("Dune","Frank Herbert");
• Carte altaCarte = new Carte();
• }}
REZULTATUL REALIZĂRII
• run:
• pret 100.0 titlu Nimic autor Anonim
• pret 1 0.0 titlu 1 Dune autor 1 Frank Herbert
• pret 100.0 titlu Nimic autor Anonim
• public class Carte {
• //NU este un constructor - are tip returnat
• public void Carte(){
• System.out.println("O metoda simpla fara logica !");
• }
• public static void main(String[] args)
• {
• //construieste un obiect de tip Carte cu constructorul default
• Carte b1 = new Carte();
• b1.Carte(); //apel metoda simpla - NU constructor
• }
• }
REZULTATUL REALIZĂRII
• run:
• O metoda simpla fara logica !

S-ar putea să vă placă și