Tutorial Java 6 – #6 Clase si obiecte

Clasele reprezinta principiile de baza ale programarii orientate obiect. Clasele reprezinta notiuni abstracte, povesti, modele (blueprints), ce descriu:

  • caracteristicile, atributele unui obiect; reprezinta ceea ce stie sau ce este obiectul;
  • ce stie sa faca obiectul, comportamentul acestuia descris de metodele sale;

Pe baza claselor,programatorul poate defini ceva concret, obiecte. Astfel, prin instantierea clasei (atributele definite in clasa, sunt initializate cu valori) se obtin variabile de tip obiect. Pentru cei care au cunostinte de C, o clasa este asemenea unei structuri, definita prin struct, in care poti defini si metode.

Alte topicuri care fac parte din acest tutorial Java 6 sunt accesibile prin Tutorial Java 6 – Continut.

Termenul de Programare Orientata Obiect descrie o metodologie prin care aplicatia software poate fi descompusa in obiecte, ce reprezinta componente dezvoltate pentru a rezolva probleme mai mici. Obiectivul Programarii Orientata Obiect este de a descompune solutia complexa in probleme mai mici (clase) si mai usor de gestionat. Alte concepte ale Programarii Orientata Obiect (ce vor fi detaliate in posturi separate):

  • incapsulare – metodologie prin care se ascunde cat mai mult din mecanismele interne ale clasei; atributele obiectelor nu sunt accesibile direct, ci doar prin intermediul interfetei (colectie de functii); in afara clasei se stie doar ce face clasa, insa nu se stie cum si nici nu ai posibilitatea de a modifica acest lucru;
  • derivare/mostenire – permite extinderea unei clase existente si construirea unei noi solutii pe baza unei solutii existente fara a o modifica pe aceasta;
  • polimorfism – permite implementarea de solutii diferite sub aceeasi denumire.

Cum se defineste o clasa in Java

Sintaxa generala prin care se defineste o clasa in Java 6 este:

[modificator_acces] class nume_clasa [extends base_class]
[implements interface1, interface2, …]
{
//inceput bloc clasa

//atribute

//metode

//blocuri de cod

//alte clase

}
//sfarsit bloc clasa

unde:

modificator acces – descrie drepturile de utilizare a acestei clase dintr-un program Java;  acest atribut este optional, avand ca valoare default, private; desi este dedicat un alt post doar pentru a intelege modificatorii de acces, acum retinem valorile posibile:

  • public – in termeni de securitate, clasa poate fi folosita oriunde in programul Java;
  • protected
  • private

class – cuvant cheie in Java ce defineste aceasta structura

nume clasa – numele clasei definit de programator; numele clasei trebuie sa respecte aceleasi conventii de nume ca si orice variabila (post variabile)

extends – permite derivarea dintr-o clasa de baza (mai multe in tutorialul despre derivare/mostenire)

implements – permite derivarea din una sau mai multe interfete (mai multe in tutorialul despre interfete)

La modul cel mai simplu, sintaxa necesara definirii unei clase este

class nume_clasa 
{
//inceput bloc clasa

//atribute

//metode

//blocuri de cod

//alte clase

}//sfarsit bloc clasa

In ceea ce priveste atributele definite in clasa acestea pot reprezenta:

  • variabile de instanta sau atribute ale obiectelor
  • variabile statice – un fel de variabile globale

In ceea ce priveste metodele (functiile) definite in clasa acestea sunt:

  • functii constructor;
  • functii accesor (get-eri si set-eri)
  • metode de prelucrare

Legat de modul de declarare a atributelor si a metodelor nu exista reguli cu privire la modul in care acestea trebuie definite, insa o gestiune mai usoara a codului se face daca atributele sunt definite grupat.

La definirea de clase se tine cont de:

  1. intr-un fisier Java, .java, pot fi definite mai multe clase;
  2. intr-un fisier Java, doar o clasa poate fi definita publica;
  3. fisierul sursa Java care contine clasa publica se are acelasi nume ca si clasa (la nivel case sensitive); clasa publica Carte se gaseste in Carte.java ;
  4. blocul unei clase este definit de { si } ;
  5. daca intr-un fisier sursa .java sunt definite mai multe clase, atunci prin compilarea fisierului se obtine bytecode, fisiere .class, pentru fiecare clasa.

Pe baza sintaxei simple, se defineste o clasa simpla Java ce descrie o carte. Cartea este descrisa de atributele pret, titlu si autor, iar comportamentul este definit de metodele getPret() si afiseaza().

class Carte{
    //definire atribute - variabile pentru instante
    float pret;
    String titlu;
    String autor;

    //definire metode
    public float getPret(){
        return pret;
    }
    public String afiseaza(){
        return "Cartea "+titlu+" are ca autor "+autor;
    }
}

Cum se construiesc obiecte

Daca clasa reprezinta ceva abstract, obiectele reprezinta ceva concret. Obiectele reprezinta instante ale clasei deoarece prin construirea unui obiect povestea din spatele clasei devine ceva concret: un spatiu de memorie in Heap in care atributele au valori.

Obiectele sunt construite prin operatorul new care va apela functia constructor din clasa (cu sau fara parametrii):

Pentru a testa clasa Carte definita mai devreme vom construi o noua clasa publica, TestCarte (fisierul Java se numeste tot TestCarte.java):

public class TestCarte {
    public static void main(String[] args) {
	//definire referinta
	Carte carte1;	//are valoarea null
	Carte carte2 = null;
	//creare obiect
        carte1 = new Carte();
	carte2 = new Carte();
    }
}

Obiectul ca si variabila reprezinta o referinta (pointer) ce gestioneaza o adresa din Heap. Prin intermediul acestei adrese avem acces la zona de memorie rezervata pentru obiect in care se gasesc valorile atributelor sale.

Prin definirea unui obiect se obtine o simpla referinta care are valoarea implicita null. Pentru a da valoare acestei referinte se construieste (instantiaza) obiectul prin new.

Cum se acceseaza atributele si metodele

Obiectul are acces la atributele si metodele sale (care nu sunt statice) prin intermediul operatorului . (punct).

public class TestCarte {
    public static void main(String[] args) {
        Carte carte1 = new Carte();
	carte1.pret = 23;
        carte1.titlu = "Dune";
        carte1.autor = "Frank Herbert";
        System.out.println(carte.afiseaza());
        Carte carte2 = new Carte();
	carte2.pret = 35;
        carte2.titlu = "Harry Potter";
        carte2.autor = "J.K. Rowling";
        System.out.println(carte.afiseaza());
    }
}

Accesul la metodele si atributele obiectului din afara clasei, cum se vede in exemplul anterior in care obiectul carte este folosit in clasa TestCarte, poate fi controlat prin modificatorii de acces (public, private, protected vor fi analizati in detaliu in alt post).

Cum arata obiectele in memorie

Pentru a intelege principiile POO in Java este important sa retinem ca in Java toate obiectele (de. ex. variabilele de tip Carte) sunt referinte iar valorile obiectelor (date de valorile atributelor sale) sunt in Heap.

Cele 2 obiecte de tip Carte, construite in exemplul anterior arata in memorie asa (este o reprezentare simplificata deoarece String este tot un obiect, ceea ce inseamna va variabila este o referinta, iar valoarea este in Heap):

Obiecte in memorie
Objects in Memory

Alte topicuri care fac parte din acest tutorial Java 6 sunt accesibile prin Tutorial Java 6 – Continut.