Creeaza.com - informatii profesionale despre


Cunostinta va deschide lumea intelepciunii - Referate profesionale unice
Acasa » scoala » informatica » java
Programarea orientata pe obiecte

Programarea orientata pe obiecte


Curs

Programarea orientata pe obiecte

Programarea orientata pe obiecte se refera la constructia programelor din obiecte. Un obiect este o combinatie de anumite date (variabile) si anumite actiuni (metode).

Declaratia structurii tuturor obiectelor de acelasi fel se numeste clasa. Asadar, o clasa este o generalizare a unui obiect. Odata descrisa o clasa, un obiect particular este construit prin crearea unei instante a clasei.



Programarea orientata obiect in Java este un caz particular a celei din C++.

Exemplu:

Un exemplu de applet care afiseaza un cerc. Acesta se poate mari sau micsora.

import java.awt.*;

import java.awt.event.*;

import java.applet.Applet;

public class JocBalon extends Applet implements

ActionListener

public void actionPerformed(ActionEvent event)

public void paint(Graphics g)

}

// urmeaza definitia clasei Balon

class Balon

public void schimbaMarimea(int schimbare)

public void afiseaza(Graphics g)

}

Constructorul este o metoda a clasei ce are ca scop initializarea unor date membre ale clasei. Acesta trebuie sa aiba acelasi nume cu al clasei.

Incapsularea (ascunderea informatiei) se face folosind modificatorul de acces private sau public. Datele si metodele private se pot accesa doar din interiorul clasei. Datele si metodele public se pot accesa de oriunde (chiar si din afara pachetului). Vom vorbi mai tarziu despre modificatorul protected care semnifica accesul la aceste date si metode doar din clasele derivate. Lipsa oricarui modificator de acces semnifica accesul la date si metode doar din interiorul pachetului (un fel de echivalent friend din C++).

Crearea unui obiect se face cu new.

Sintaxa generala ar fi:

numeClasa obiect = new numeClasa(val1, val2, , valn);

sau, echivalent:

numeClasa obiect;

obiect = new numeClasa(val1, val2, , valn);

Deci operatorul new creeaza un nou obiect al clasei, cu toate variabilele si metodele clasei. Observa, ca are loc crearea si initializarea unor variabile. De aceea, constructorul trebuie sa aiba acelasi nume cu al clasei.

Se mai spune ca un obiect este o instanta a unei clase, si crearea unui obiect se numeste instantierea acelei clase.

Exemplu:

Putem crea obiecte ale claselor predefinite (de ex. TextField)

TextField obiect = new TextField();

Intr-un applet de exemplu, de forma:

public class Exemplu extends Applet

browser-ul sau appletviewer-ul va genera la executie:

new Exemplu();

creand astfel primul obiect al acestei clase. Acest obiect poate crea la randul sau alte obiecte. Dupa crearea acestui obiect, browser-ul apeleaza metoda init().

In cazul aparitiei unui eveniment se apeleaza metoda actionPerformed(sau adjustmentValueChanged, itemStateChanged) pentru a rezolva (trata) evenimentul.

Daca exista un apel al lui repaint(), se va invoca functia paint(). Sistemul apeleaza prima data functia paint(), daca aceasta exista.

Recomandari

Dati nume sugestive pentru variabile si metode. In general, ele incep cu litera mica, iar restul cuvintelor incep cu litera mare. Numele claselor incep cu litera mare. Ex: metodaUna, variabilaDeLucru, ClasaNoastra.

Despre this

this are aceeasi semnificatie ca in C++. Odata creat un obiect, this reprezentand referinta la acel obiect. Din interiorul obiectului, acesta nu poate fi accesat decat prin identificator. In acest context se foloseste this.

Exemplu 1:

Am vazut in programele Java precedente instructiuni de forma:

private Scrollbar baraDefilare;

baraDefilare.addAdjustmentListener(this);

Metoda addAdjustmentListener a obiectului baraDefilare este invocat cu parametrul this. Cuvantul this spune ca acesta este obiectul particular care trebuie referit cand se intampla un eveniment.

Exemplu 2:

Suntem intr-o clasa Java si dorim sa apelam o metoda a acestei clase:

float a = calculeazaAria();

Aceasta este echivalenta cu:

float a = this.calculeazaAria();

Exemplu 3:

Cand numele parametrilor coincid cu numele variabilelor, atunci 'trebuie' sa folosim pointer-ul this:

private int x,y;

public void seteazaValorile(int x, int y)

Exemplu 4:

Cand dorim ca o functie sa returneze obiectul curent, aceasta se poate face astfel:

return this;

Instanta unui obiect

Uneori dorim sa testam carei clase particulare apartine un obiect. Daca avem ob un obiect al clasei A, atunci expresia

ob instanceof A intoarce true.

ATENTIE !!! litera 'o' din instanceof este litera mica !

Exemplu:

public void actionPerformed(ActionEvent eveniment)

Tipuri predefinite


Variabilele care sunt boolean, char, byte, short, int, long, float si double nu sunt obiecte, dar sunt variabile predefinite (built-in type). Variabilele de aceste tipuri au operatii predefinite (+ ,==,).

In contrast, declararea si crearea variabilelor unei clase (obiect) se face cu operatorul new. Obiectele unei clase nu au neaparat operatiile de mai sus.

Pentru uniformizarea lor, exista asa numitele clase wrapper:

Boolean, Character, Integer, Long, Float si Double. ( Ex: citirea unui intreg, float, ).

Opearatii cu obiecte

Exemplu:

String s1='abs', s2='abc';

if (s1 == s2)

System.out.println('Sirurile s1 si s2 sunt egale');

Este corect?

Nu, deoarece sirurile de caractere se reprezinta ca si vectorii, deci s1 este de fapt adresa din memoria calculatorului unde se afla sirul abc. In cazul exemplului nostru, variabilele s1 si s2 de tip String vor avea adrese distincte deci nu se executa ramura principala a testului.

Cum rezolvam totusi testul valorilor a doua siruri de caractere. In pachetul java.lang.String exista metoda

public boolean equals(Object obiect) care returneaza true daca obiectul ce o apeleaza are aceeasi valoare cu a parametrului.

Exemplu:

Forma corecta este:

String s1='abc', s2='abc';

if (s1.equals(s2))

System.out.println('Sirurile s1 si s2 sunt egale');

Observatie:

Putea fi si if (s2.equals(s1))

Sa zicem ca pentru programul nostru precedent dorim sa comparam aria a doua obiecte de tip Balon. Folosind strategia precedenta avem:

public boolean equals(Balon balon)

Balon b1, b2;

if ( b1.equals(b2) )

Apel prin valoare

Cand o variabila care este de tip predefinit este trimisa ca parametru unei metode aceasta se trimite prin valoare. Asta inseamna ca se trimite o copie a variabilei ca parametru pentru acea metoda. Consecinta este ca orice face metoda cu parametrul nu se modifica valoarea variabilei dupa apelul functiei.

Apel prin referinta (sau adresa)

Cand un obiect este folosit ca parametru acesta se trimite prin referinta.

O referinta nu este o copie a unui obiect ci un pointer la acel obiect. Deci de fiecare data cand o metoda modifica parametrul obiect atunci se schimba si obiectul partii de program care apeleaza metoda.

Distrugerea obiectelor si garbage collection

Obiectele se creeaza cu new. Cand mor ele?

Exemplu:

Balon b = new Balon(20, 100, 100);

b = new Balon(40, 200, 200);

Ce se intampla cu primul obiect care a avut o 'viata' foarte scurta. Mai precis ce se intampla cu memoria alocata acestuia care nu sa reutilizat. Al doilea obiect are repartizata alta zona de memorie.

In Java exista un mecanism care este apelat automat numit garbage collection ('colectarea gunoaielor' evident in ideea refolosirii spatiului lor de memorie).

Exista insa cazuri cand alocarea zonei de memorie nu sa facut cu new, mai precis acele metode scrise in alte limbaje de programare (specificate native). De asemenea exista cazuri in care se solicita eliberarea unor alte resurse decat cele de memorie, de exemplu a unor conexiuni cu fisiere sau a unor conexiuni in retea.

Java pune la dispozitie metoda finalize mostenita din clasa Object:

protected void finalize() throws Throwable

Aceasta metoda este apelata de runtime system inainte ca memoria alocata obiectului respectiv sa fie dealocata de Garbage Collector. Problema care se pune este ca nu se stie cand obiectul va fi curatat deci nici cand se va face apelul metodei finalize. Se stie doar ca aceasta va avea loc inainte ca zona de memorie respectiva sa fie reutilizata.

In clasa System exista functiile:

public static void gc();

public static void runFinalization();

public static void runFinalizersOnExit(boolean value);

Metoda gc() forteaza executia garbage collector-ului si se foloseste impreuna cu runFinalization() care implica executia metodelor finalize() a obiectelor care nu mai sunt referite de nici un handle (referinta) dar care

nu au fost inca finalizate.

Metoda runFinalizersOnExit() seteaza flagul ce indica jvm-ului daca se executa sau nu metodele finalize ale obiectelor inca neeliberate la oprirea masinii virtuale.

Supraincarcarea metodelor

O clasa poate avea doua sau mai multe metode cu acelasi nume. Desi pare confuz compilatorul rezolva aceasta ambiguitate verificand numarul de argumente, tipurile parametrilor si tipul intors de functie.

Exemplu 1:

public void f(int a)

public void f(float b)

public void f()

public int f(int a)

In acest exemplu functia f are 4 variante distincte. De exemplu prima varianta difera de ultima prin faptul ca aceasta din urma intoarce int.

Exemplu 2:

Avem

class A

Putem defini cei doi constructori astfel:

public A(int a1, int b1)

public A(int a1, int b1, int c1)

Ultima forma se poate rescrie folosind pointer-ul this si primul constructor astfel:

public A(int a1, int b1, int c1)

Exemplu 3:

Supraincarcarea metodelor este des intalnita in clasele predefinite.

TextField camp1 = new TextField();

TextField camp2 = new TextField(10);

Al doilea constructor specifica latimea campului de caractere.

ATENTIE !!! Nu confundati supraincarcarea cu supraincarcarea metodelor, aceasta din urma referindu-se la mostenire.

Membri statici

O metoda sau o variabila poate fi descrisa ca static. Asta inseamna ca aceasta apartine unei clase si nu unor obiecte individuale create ca instante ale clasei. Exista doar o copie a acestui articol static si este asociat clasei.

Exemplu 1:

Metoda sqrt din clasa Math este statica. Ea nu actioneaza pentru un obiect anume. Ea doar accepta un paramentru, un numar si calculeaza radacina patrata. De altfel toate metodele din clasa Math sunt statice. Putem scrie:

y = Math.sqrt(x);

Clasa Math contine variabile statice. De exemplu, constanta PI este definita ca Math.PI.

Exemplu 2:

Si metoda toString() din clasa Integer este statica:

String sir = Integer.toString(numar);

Exemplu 3:

class A

public static int diferenta(int x, int y)

}

public class B

}

Observatie:

Stilul din exemplul acesta este evident lipsit de programare orientata pe obiecte. Putem scrie programe Java care folosesc metode statice.

Recomandarea este sa folositi cat mai putini mebri statici.

Exemplu 4: (important)

Contorizarea obiectelor create prin instantierea unei clase. Dorim relativ la programul precedent sa numaram cate baloane (mingi) au fost create.

private static void aduna()

public static void afiseazaNumarMingi(Graphics g)

Apelul se face folosind numele clasei si nu al unui obiect al clasei:

Balon.afiseazaNumarMingi(g);

Observatie.

Descriptorul (calificatorul) static nu inseamna ca variabila statica nu se poate modifica, inseamna de fapt contrar variabilelor nestatice ca in momentul crearii (instantierii) unui obiect al unei clase nu se va crea o copie a unei variabile statice. Similar la crearea unui obiect nu se creaza o copie a metodei statice.

Constructorii unei clase sunt metode statice (chiar daca nu sunt marcate cu acest descriptor).

Este o regula ca metodele statice sa acceseze doar variabile si metode statice si nu altele. Aceasta este logic deoarece orice alta variabila sau metoda nonstatica sunt proprietati ale unor obiecte individuale.

null

null este un cuvant cheie Java. Inseamna un obiect care nu exista.

Exemplu:

A a;

a.afiseaza();

programul se va opri cu un mesaj de eroare de tip 'null pointer exception'.

Aceasta deoarece am declarat un obiect dar nu l-am creat folosind new. Obiectul nu exista. El are valoarea null.

Daca dorim sa distrugem explicit un oiect (desi un obiect nefolosit este automat distrus de sistemul garbage collector) putem sa ii asignam valoarea null acelui obiect.

Clase si fisiere

Daca un program consta doar dintr-o singura clasa, codul sursa Java este plasat intr-un fisier cu acelasi nume ca al clasei dar cu sufixul .java. Orice instructiune de tip import trebuie plasata inaintea header-ului (declaratia clasei). Compilatorul transforma codul Java in byte code, plasat intr-un fisier cu numele clasei dar cu extensia class.

Daca programul consta in mai mult de o clasa exista doua alternative:

1. Plasarea tututor claseor intr-un fisier

2. Plasarea fiecarei clase intr-un fisier (cu acelasi nume).

Daca toate clasele sunt plasate intr-un singur fisier, prima clasa din fisier trebuie declarata public iar celelalte nu. Numele fisierului trebuie sa corespunda cu prima clasa a fisierului.

Cum putem imparti o clasa prea mare in doua clase mai mici ?

Presupunand ca initial avem:

class A

void f()

void g() //dorim ca g sa fie in alta clasa. ATENTIE ! g are acces

Una din rezolvari este:

class A

void f()

}

class B

void g()

Exercitii propuse spre implementare

1. Considerand jocul de table, simulati miscarea pieselor folosind cele doua zaruri (proiect).

2. Scrieti o clasa Java care genereaza numere pseudoaleatoare din domeniul 0 . Presupunand ca avem o samanta(seed) r=r0, pentru generarea urmatorului numar aleator din domeniul 0..65535 folosim formula:

rNou = ((rVechi*25173)+13849)%65536

3. Scrieti o clasa Java care simuleaza corpul numerelor complexe. Trebuie sa implementati citirea unui numar complex, suma si produsul a doua numere complexe.





Politica de confidentialitate


creeaza logo.com Copyright © 2024 - Toate drepturile rezervate.
Toate documentele au caracter informativ cu scop educational.