Bine te-am gasit! Acest tutorial de programare in Java este despre clase, obiecte, constructori si principul incapsularii folsindu-ne de Java. Toate aceste concepte fac parte din programarea orientata pe obiecte (POO). Vom incepe direct, fara a mai face o introducere elaborata. Asa ca porneste Eclipse-ul! 🙂

Clase in Java – Programare Orientata pe Obiecte

Dupa ce ai deschis Eclipse, creeaza un proiect ce se va numi ClaseInJava. Apoi creeaza o clasa ce se va numi ClasaPrincipala:

public class ClasaPrincipala {
}

Creeaza main-ul. Asa trebuie sa arate:

public class ClasaPrincipala{
public static void main(String)[] args) {
}
}

Vom ramane aici pentru cateva momente, pentru ca vreau sa iti spun mai multe lucruri. In primul rand, ce este o clasa? O clasa este un tip de date definit de catre un utilizator. Scopul unei clase este sa ne ajute sa grupam si sa ne eficientizam mai mult munca. Cu ajutorul unei clase vom face lucrurile mult mai bine si intr-un mod mult mai structurat.

Sunt clase care exista deja in Java si in alte limbaje de programare similare cu Java, cum ar fi C++ si altele. In toate aceste limbaje exista deja anumite functii, anumite grupari, anumite clase care au scopul de a ne ajuta pe noi sa ne eficientizam munca. Ce rost are avea un limbaj de programare fara functiile definite de catre o comunitate, de catre persoanele care au dezvoltat acel limbaj?

Fiecare limbaj are specificul lui si ne ajuta sa ne facem munca mult mai eficient, in anumite arii. De exemplu, cand facem programare in Java, e mai usor sa facem aplicatii pentru telefoane sau pentru servere. Cand facem programare in PHP, va fi mult mai usor sa ne ocupam de partea de web pentru ca acest limbaj a fost optimizat si gandit pentru asa ceva.

Programarea in C ne va ajuta sa facem lucruri care tin de sistemul de operare sau de programarea placutelor pentru ca acest limbaj este foarte rapid si asa a fost conceput. O sa vezi ca fiecare limbaj de programare are specificul lui. Dupa cum poate iti mai aduci aminte de la matematica (nu ca ar trebui sa fii expert in matematica, dar bazele din scoala generala ar ajuta mult), am facut numere reale, numere integer (adica intregi), float (adica numere reale) si asa mai departe.

Obiecte in Programarea Orientata pe Obiecte

In engleza, “numerele intregi” se numesc “integer”. Sunt doua moduri in care putem defini un numar intreg:

Integer x;
int y;

int y este o variabila si este o variabila clasica pe care probabil ai vazut-o si in alte limbaje de programare. Dar Integer este un pic diferit. Acesta este pur si simplu o clasa, dupa cum si Eclipse iti va spune pe ecran:

The Integer class wraps a value of the primitive type int in an object.

Aceste variabile trebuie intializate. Modul in care initializam o variabila de tip int este prin semnul “=” si valoarea pe care vrem sa o dam, in cazul nostru 0:

Integer x;
int y = 0;

Modul in care initializam o variabila de tip Integer – sau o variabila care este de fapt un obiect pentru ca x in acest caz este de fapt un obiect al acestui Integer, adica x va prelua proprietatile, metodele, functiile care exista in aceasta clasa Integer si le va putea folosi – va fi:

Integer x = new Integer(5);

I-am dat valoarea 5. Haideti sa printam acest lucru pe ecran:

System.out.println(x);
System.out.println(y);

Cand vom rula cele doua, pe ecran va aparea:

5
0

Acum poate te gandesti “Ok, si ce sens au aceste x si y? De ce e unul Integer si celalalt int?”. Ei bine, punand un “.” si scriind:

System.out.println(x.);

putem sa apelam metodele care se afla in clasa Integer. Asta este frumusetea acestor obiecte, acestor clase si a programarii orientate pe obiecte. Faptul ca noi definim un obiect al unei clase si acel obiect poate sa preia proprietatile clasei respective. De exemplu, putem transforma acest Integer intr-un String. Deci 5 sa nu mai fie o cifra, ci o litera. Stiu ca nu suna foarte corect, dar sunt diferite moduri in care poti sa procesezi aceste date.

De exemplu, in momentul in care tu iti introduci informatiile bancare si vrei sa cumperi ceva online, ai o grupare de litere si cifre. Ei bine, toate acele date vor fi tratate ca fiind String-uri si apoi vor fi analizate. Deci vor fi String-uri, nu vor fi luate ca fiind intregi. Abia dupa ce vor fi luate ca String-uri si procesate, tranzactia va avea succes.

Putem transforma x-ul in String, putem transforma acelasi x din Integer sa fie un int (public int intValue () – asta este clasa care transforma acest Integer intr-un int), si tot asa. Exista foarte multe lucruri pe care le poti face aici.

Urmareste acest tutorial in care explic mult mai clar conceptul de Programare Orientata pe Obiecte folosind Java:

Compararea a 2 variabile in Java

Poti sa vezi care este valoarea maxima, sa compari doua int-uri, poti sa definesti un hash al lor, sa vezi care este cel mai mare bit, poti sa faci maximul intre cele doua sa afli care este mai mare dintre a si b. Sunt functii, dupa cum spuneam, predefinite in aceste clase. Vom alege functia toString si vom adauga un cuvant la intamplare care va fi, sa zicem, “tare”:

System.out.println(x.toString() + “tare”);

Vom rula si pe ecran va aparea:

5tare

Aceasta a devenit, by default, un String. Acelasi lucru poti sa il faci si cu String-uri. Poti sa iti definesti un obiect String, sa spunem:

String a = new String(“abc”);

Asta inseamna ca acestui a ii putem face diferite lucruri cu functiile predefinite, scriind:

a.

si selectand fie length() pentru a afla lungimea totala a acestui sir, sau specificand ca vrem sa luam un substring din acest String, de la 0 la 1:

String b – a.substring(0, 1);
System.out.println(a + “vs” + b);

Dupa ce vom rula, pe ecran va aparea:

abc vs. a

b are valoarea a.

Revenind in:

System.out.println(x.toString() + “tare”);
System.out.println(y);

observam ca y nu are aceste proprietati. Nu ii putem atribui ceva. Nu are anumite functii in spate de care sa se foloseasca. Si atunci y, dupa cum poti sa vezi, este o variabila clasica. Este un tip de variabila clasica, din acelea int, float, double si asa mai departe. Deci nu il vom putea folosi pentru a face operatii mai complexe.

Creare unei clase in Java folosind POO

Si acum sa vedem cum putem crea o clasa proprie si cum putem sa definim astfel de metode in aceste clase. Vom crea o noua clasa, ClasaMea, accesand New Class si numind-o:

public class ClasaMea {
}

Este foarte important ca numele fisierului sa fie identic cu numele ce va fi scris in linia de cod, mai ales daca este public. O sa vorbim in tutorialele urmatoare ce inseamna public, ce inseamna private.

Pe scurt, cand o clasa este public inseamna ca va putea fi apelata din alte clase. Adica aceasta clasa fiind public, o vom putea apela din ClasaPrincipala sau chiar dintr-un alt pachet. Vom discuta despre acest lucru mai tarziu. Daca ClasaMea ar fi private, in momentul care vom vrea sa facem diferite lucruri cu ea, nu vom putea.

Crearea variabilelor (campuri) in clasa

Hai sa definim in ClasaMea:

public class ClasaMea {
int x;
String a;

public String numeleMeu(String nume) {
return nume;
}
}

Am creat doua variabile (int x si String a), dupa care am creat o metoda care este publicString, adica imi va intoarce un String ce se numeste numeleMeu si cere ca parametru un nume, si apoi am intors acest nume. Revenind in ClasaPrincipala, vom defini un obiect ce se va numi ClasaMea:

ClasaMea ob1 = new ClasaMea();

Astfel am creat un obiect si l-am intializat. Daca vom scrie sub:

ob1.

vom vedea ca avem variabile declarate mai inainte: String a si int x.

Atribuirea valorilor unor obiecte in POO

Vom lua ob1.x si ob1.a si le vom da valori:

ob1.x = 10;
ob1.a = “Ramon”;

Apoi vom printa in felul urmator:

System.out.println(ob1.numeleMeu(ob1.a));

Dupa ce vom rula, pe ecran va aparea

Ramon

Ce am facut aici este ca am apelat functia din ob1, functia din ClasaMea, si i-am dat variabila ca si parametru, mai exact variabila String a careia noi i-am atribuit o anumita valoare.

In clasa principala, putem merge mai departe si adauga in

System.out.println(ob1.numeleMeu(ob1.a));

astfel:

System.out.println(ob1.numeleMeu(ob1.a) + “ numarul este: ” + ob1.x);

Pe ecran va aparea:

Ramon numarul este: 10


Constructori & Destructori in Java

Acum ca ai inteles si ai vazut cum se folosesc clasele in Java, a venit momentul sa mergem mai departe si sa vorbim despre Constructori (si Destructori) in POO (Programarea Orientata pe Obiecte) – aceste concepte se aplica in orice limbaj orientat pe obiecte si nu doar in Java.

Ce este un constructor in POO?

Constructorul unei clase este o functie interna, speciala a acelei clase care este apelata in momentul in care se creeaza o instanta a acelei clase. De exemplu:

public in getAge() {
return this.age;
}

In momentul in care rulam programul, in background va fi apelat constructorul clasei Proiect care poate sa faca urmatoarele operatiuni:

  • Initializarea campurilor (variabilelor) clasei sau a celor date ca parametru
  • Alocarea memorie pentru acestea sau alte campuri ale clasei

In exemplele care urmeaza vei vedea cum declaram constructorii unei clase si cum ii putem folosi pentru o alocare cat mai eficienta a resurselor.

Ce este un destructor in POO?

Daca un constructor este folosit pentru initializarea variabilelor si alocarea de memorie pentru diferiti membri ai clasei, atunci destructorul este o componenta apelata in momentul in care se termina executia codului pentru dealocarea obiectului din memorie.

Astfel gestiunea memorie va fi corect facuta (memoria alocata initial, fiind eliberata pentru folosirea acesteia de catre alte programe). In Java nu este necesara crearea unui destructor pentru ca acest proces are loc automat in momentul in care se termina executia programului.

Folosirea constructoriilor in Java

Vom crea un proiect nou pe care il vom putea denumi ProiectClase. Vom vedea clasa principala cu functia Main, unde adaugam toate elementele pentru a rula programul, si vom crea clasa Person prin care vom defini o persoana. Clasa Person va contine urmatoarele campuri principale care definesc o persoana: varsta, sex, nume si prenume, CNP.

Aceasta clasa, impreuna cu campurile care o compun, ne va ajuta sa colectam mai multe date despre persoanele care folosesc aplicatia (gandeste-te la o aplicatie de gestiune a clientilor, de exemplu). 

Permite-mi sa-ti dau un exemplu: In momentul in care vizitam un site web si introducem datele personale, in spate sunt anumite structuri sau clase ce iti cer acele date si le structureaza intr-un singur loc. Prin urmare, clasa Person ne va ajuta sa luam un cumul mare de date si sa le aranjam intr-un mod mai ordonat is mai clar, ca apoi sa putem interpreta si folosi informatia in diferite scopuri. Astfel, la inceput clasa noastra va arata in felul urmator:

class Person {
    int age;
    String fname;
    String lname;
    String sex;
}

Te poti gandi la mai multe elemente care apartin unei persoane. Poti merge mult mai in detaliu, prin adaugarea altor caracteristici precum CNP, inaltime, studii etc. Iar acum, sa definim constructorul nostru:

Person() {
}

In acest constructor vom trece o valoare default a campurilor definite mai sus, iar in momentul in care o instanta noua va fi creata (vezi urmatoarea secventa de cod), i se vor atribui chiar aceste valori:

Person() {
    age = 20;
    fname = “Unknown”;
    lname = “Anonymous”;
    sex = null;
}

In main vom defini un obiect al clasei Person pe care il vom initializa (acesta devenind o instanta a clasei):

Person A = new Person();

Acest constructor poate avea mai multi parametri daca il vom scrie:

Person (int age, String fname) {
}

In momentul in care cream o instanta, trebuie sa adaugam o valoare pentru acea instanta. Astfel ca, constructorul initial pe care l-am definit astfel: “Person (int age, String fname)” va deveni:

Person (int age, String fname) {
    this.age = age;
    this.fname = fname;
}

In acest caz keywordul this se refera la valoare, in contextul variabilelor din cadrul clasei. Aici, “this.age = age;va fi aceasta variabila. Ii va atribui lui int age valoarea pe care o vom da. Vom folosi this. pentru a distinge intre cele doua variabile age pe care le avem. Ii vom putea atribui valoarea in Main, unde vom putea inlocui:

Person A = new Person(20, “Adi”);

cu:

Person A = new Person(24, “Ramon”);

sau alte valori pe care doresti sa le introduci. Scriind aceste valori, o sa vezi ca variabilei age i se va atribui valoarea 24 si variabilei fname, valoarea Ramon.

Iata in tutorialul de mai jos un exemplu clar despre constructori si cum sa-i folosesti in programarea orientata pe obiecte cu Java:

Incapsularea in Programarea Orientata pe Obiecte

In acesta sectiune vom afla despre gettere, setere si specificatorii de acces (public, private si protected) care fac principiul incapsularii posibil. Acestea din urma sunt moduri de “securizare” a accesului la diferite functii, clase, etc. Toate sunt parte a POO (Programare Orientata pe Obiect) si au legatura directa cu principul Incapsularii. Dar hai sa incepem prin a deschide Eclipse si a porni de unde am ramas data trecuta.

Aceasta metoda de apelare nu este tocmai cea mai eficienta pentru ca mai multe persoane pot veni si modifica ceea ce am scris. Vom avea nevoie sa protejam aceste variabile, asa ca le vom apela printr-un mod mai standardizat. Astfel ca avem nevoie de cateva elemente ce tin de “securitatea” la nivel de cod.

Asta inseamna ca in orice proiect in Java in care vom vrea sa apelam clasa Person, vom putea face asta pentru ca functia este public. Daca ar fi private, aceasta functie nu va putea fi deloc apelata din alt fisier,

Vom schimba in Person, unde am denumit int si String-urile, private:

public in getAge() {
return this.age;
}

Acum ca am definit cele 3 campuri (aka. variabile) este momentul sa le initializam in constructorul

Aceasta este pentru a nu putea apela functiile din alta parte. In Main vom primi o eroare ca variabilele age, fname si lname nu mai sunt vizibile. Pentru a le putea din nou apela, trebuie sa creem mai multi getteri.

Iti recomand sa urmaresti acest tutorial despre incapsularea din programarea orientata pe obiecte in care folosesc getters si setters:

Getter in Programarea cu Java

Un getter este o metoda care arata in felul urmator:

Vom crea acest getter de mai sus in Person. Este public pentru ca vrem sa il apelam de oriunde. Revenim in Main si inlocuim astfel:

System.out.println(“This person “ + A.fname + “ has “ + A.age + “ years old”);

cu

System.out.println(“This person “ + A.fname + “ has “ + A.getAge() + “ years old”);

Facem acelasi lucru cu fname si lname, in Person:

public String getFname() {
return this.fname;
}

si

public String getLname() {
return this.lname;
}
In Main vom schimba astfel:
System.out.println(“This person “ + A.getLname() + “ has “ + A.getAge() + “ years old”);

Dupa ce vom rula, pe ecran va aparea:

This person Ramon has 24 years old.

Acesta este un mod mai securizat si curat de a apela variabilele create. Pur si simplu apelam metodele care intorc variabila respectiva.

Setter in Programarea cu Java

Pentru a modifica aceste variabile, trebuie sa revenim in Person si sa creem setteri:

public void setAge(int age) {
this.age = age;
}

age din aceasta linie de cod este parametrul pe care l-am introdus mai devreme. this.age este campul private int age;.

Continuam sa facem acelasi lucru si pentru restul functiilor:

public void setFname(String fname) { this.fname = fname; }
si
public void setLname(String fname) {
this.lname = lname;
}

In Main, vom scrie pentru a modifica si a printa:

Pe ecran, va aparea modificat:

This person’s name is: Adi null and he/she is 23 years old

Null apare pentru ca nu am definit lname. Putem sa il setam in Main:

A.setLname(“Nastase”);

Dupa ce vom da Run, pe ecran va aparea:

This person’s name is: Adi Nastase and he/she is 23 years old

Cam atat despre specificatorii de acces (public, private si protected) getteri si setteri. Public este pentru ca oricine sa ne poata folosi clasa, functia sau ce mai avem creat. Private este pentru a folosi campurile doar in aceeasi clasa sau functie.

Mai este si protected care inseamna ca putem folosi tot ce am creat in acelasi pachet. Acest pachet despre care vorbesc este de obicei creat la inceput. Fiecare pachet are caracteristicile si functiile lui, iar daca functiile sunt protected, nu pot fi folosite in afara pachetului. Daca sunt private, nu pot fi folosite in afara fisierului. Numai public permite folosirea lor de oriunde.

Aceste sunt doar cateva metode pe care le poti folosi pentru a incepe programarea orientata pe obiecte. Cam atat cu acest tutorial!

Rezumat despre Programarea Orientata pe Obiecte in Java

Ce este o clasa?

O clasa este un tip de date definit de catre un utilizator. Scopul unei clase este sa ne ajute sa grupam si sa ne eficientizam mai mult munca. Cu ajutorul unei clase vom face lucrurile mult mai bine si intr-un mod mult mai structurat.

Ce este un obiect?

Obiectele sunt instante ale unor clase.

Ce este Programarea Orientata pe Obiecte?

Programarea Orientata pe Obiecte este o paradigma de programare care foloseste concepte abstracte (sub forma de clase si obiecte) pentru a crea modele bazate pe elemente din lumea reala. O aplicatie construita pe programare orientata pe obiecte foloseste mai multe obiecte care comunica prin mesaje specifice pentru a rezolva diverse servicii (ale aplicatiei) solicitate

Ce este un constructor?

Constructorul unei clase este o functie interna, speciala a acelei clase care este apelata in momentul in care se creeaza o instanta a acelei clase. De exemplu:

Vrei sa inveti mai multe despre in Programarea in Java?

Daca esti interesat sa inveti mai multe despre Programarea cu Java, atunci iti recomand cartea mea “Introducere in Programare cu Java”. Notiunile explicate in aceasta carte te vor ajuta extrem de mult sa intelegi atat elementele teoretice cat si cele practice care au de a face cu notiunile de baza ale programarii, programare orientata pe obiecte (POO), structuri de date si multe altele. Click AICI pentru a afla mai multe.

Ne vedem in tutorialele urmatoare!

Ramon Nastase

Eu sunt Ramon, am 25 de ani si sunt Pasionat de IT (Retelistica, Programare, Securitate, Tehnologie) si Training. Misiunea mea este sa te ajut pe tine sa-ti atingi potentialul maxim in cariera ta din domeniul IT. Cu acest gand in minte din 2017 pana in prezent, am construit o comunitate de peste 70.000 de persoane pasionate de IT si de invatare continua. Te invit sa citesti articolele de pe acest blog si sa urmaresti celelalte materiale educative de mai jos 👇
Summary
Review Date
Reviewed Item
Clase in Java | Programare Orientata pe Obiecte (POO) in Java
Author Rating
51star1star1star1star1star