Sunteți pe pagina 1din 8

Polimorfism-Obiecte de diferite tipuri folosesc aceleai metode (n fapt cu aceeai semntur

darimplementri diferite)
Ex:class Animal{
public String caracteristica(){
return"necunoscuta"; }
}
class Soarece extends Animal{
public String caracteristica(){
return"are culoarea gri";
}}
class Pisica extends Animal{
public String caracteristica(){
return"miauna";} }
class Caine extends Animal{
public String caracteristica(){
return"latra";} }
public class Polimorfism Ex{
public static void main(String args[]){
Animal a =new Soarece();
System.out.println("Caracteristi ca primului animal: "+a.caracteristica());
a =new Caine();
System.out.println("Caracteristi ca primului 2 animal: "+a.caracteristica());}}

Overloading si Overriding:
Metoda Overloading i metoda Overriding sunt dou concepte importante n Java, care permit
programatorului Java a declara metode cu acelai nume, dar un comportament diferit. Metodele
se
bazeaz pe polimorfism n Java. Diferenta intre Overloading si Overriding este ca in cazul
metodei
Overloading semnatura metodei se schimba iar in cazul lui Overriding ramane aceeasi. Alta
diferenta
intre ele este ca metoda Overloading o poti aplica in clase iar Overriding doar in subclase.

Diferenta intre Java si C++


Limbajul Java foloseste aceleasi instructiuni cu limbajul C, mai putin instructiunea goto. Tipurile
de date primitive sunt aproape aceleasi, plus tipul boolean, care a schimbat si sintaxa
instructiunilor care testeaza conditii. Diferentele importante apar la tipurile de date derivate
(vectori, structuri, pointeri) si la structura programelor. In limbajul C exista un singur fel de
comentarii, care incep prin perechea de caractere '/*' si se termina prin perechea de caractere '*/'.
In C++ au aparut, in plus, comentarii care incep prin perechea de caractere '//' si se termina la
sfarsitul liniei in care apare acel comentariu. Java preia aceste doua feluri de comentarii, la care
se adauga comentarii destinate generarii automate a documentatiilor programelor (cu ajutorul
programului javadoc); aceste comentarii incep printr-un grup de 3 caractere '/**' si se termina
la fel cu comentariile C, prin '*/'.

In Java nu exista operatorul sizeof din C, pentru determinarea memoriei ocupate de un tip sau de
o variabila, pentru ca nu este necesar acest operator (nici chiar pentru alocare dinamica de
memorie). Cea mai importanta diferenta dintre Java, pe de o parte, si limbajele C, C++ pe de alta
parte, este absenta tipurilor pointer din Java. Deci nu exista posibilitatea de a declara explicit
variabile pointer si nici operatorii unari & (pentru obtinerea adresei unei variabile) si *
(indirectare printr-un pointer). Operatorul new pentru alocare dinamica din C++ exista in Java,
dar are ca rezultat o referinta si nu un pointer. In Java nu exista declaratia typedef deoarece
definirea unei clase introduce automat un nume pentru un nou tip de date. In Java nu exista
operatorul sizeof , pentru ca lungimea variabilelor este cunoscuta, iar la alocarea de memorie (cu
new) nu trebuie specificata dimensiunea alocata. Compilatorul Java nu are preprocesor, deci nu
exista directivele preprocesor atat de mult folosite in C si in C++ : #define, #include, etc.
Mostenirea este un mecanism care permite crearea unor versiuni "specializate" ale unor clase
existente (de baza). Mostenirea este folosita in general atunci cand se doreste construirea unui tip
de date care sa reprezinte o implementare specifica (o specializare oferita prin clasa derivata) a
unui lucru mai general. Un exemplu simplu ar fi clasa Dacia care mosteneste clasa Masina.
Mostenire-se refera la posibilitatea de a crea o clasa copil, care are la baza o alta clasa
parinte, astfel incat clasa copil stie sa faca tot ceea ce stie parintele, plus o serie de alte
elemente care sunt proprii doar clasei copil.
Ex: class Rectangle {
publicint width, height;
public Rectangle (int width, int height) {
this.width = width;
this.height = height;
}
publicint circumference () { return (width + height) * 2; }
}
class Square extends Rectangle {
Square (int x) {
super (x, x); // cheam constructorul super-clasei}}
Square square = new Square (3);

Clone-se foloseste pentru crearea unei copii bit cu bit identice ale obiectului;
Ex:
public Location implements Cloneable {
public Object clone () {
Location answer;
try {
answer = (Location)super.clone (); // typecast
} catch (CloneNotSupportedException e) {
throw new RuntimeException ("class not cloneable");
}
return answer;
}}

Compozitie-contine o clasa ,procedeu folosit cand clasa defineste noi comportamente bazanduse pe mai multe clase;
Ex: class Geometric {
public Rectangle r;
public Square s;
public Geometric (int width, int height) {
r = new Rectangle (width, height);
s = new Square (width);}
publicint circumference () {
returns.circumference () + r.circumference ();}

Exceptii program n Java


O exceptie program este o situatie anormal aprut la executia unei functii si care
poate avea cauze hardware sau software. Exceptiile pot fi privite ca evenimente
previzibile, ce pot apare n anumite puncte din program si care afecteaz continuarea
programului, prin abatere de la cursul normal.
Existenta exceptiilor este un mare avantaj al limbajului Java, pentru c permite
semnalarea la executie a unor erori uzuale, prin mesaje clare asupra cauzei si locului
unde s-a produs eroarea, evitnd efectele imprevizibile ale acestor erori (n C, de ex.).
Exceptiile Java sunt de dou categorii:
- Exceptii care nu necesit interventia programatorului (numite "Runtime
Exceptions"), dar care pot fi interceptate si tratate de ctre programator. Dac nu sunt
tratate, aceste exceptii produc afisarea unui mesaj referitor la tipul exceptiei si
terminarea fortat a programului. Aceste exceptii corespund unor erori grave care nu
permit continuarea executiei si care apar frecvent n programe , cum ar fi: erori de
indexare a elementelor unui vector (indice n afara limitelor), utilizarea unei variabile
13
referint ce contine null pentru referire la date sau la metode publice, mprtire prin
zero, conversie prin "cast" ntre tipuri incompatibile, s.a.
- Exceptii care trebuie fie tratate, fie "aruncate" mai departe, pentru c altfel
compilatorul marcheaz cu eroare functia n care poate apare o astfel de eroare
("Checked Exceptions": exceptii a cror tratare este verificat de compilator).Aceste
exceptii corespund unor situatii speciale care trebuie semnalate si tratate, dar nu
produc neaprat terminarea programului. Astfel de exceptii care nu constituie erori
sunt : detectare sfrsit de fisier la citire, ncercare de extragere element dintr-o stiv
sau din alt colectie vid, ncercarea de a deschide un fisier inexistent, s.a.

Diagrama de secven (sequence diagram)


n limbajul UML colaborarea ntre elemente se cerceteaz n aspectul informativ al
comunicaiilor
lor, adic obiectele care interacioneaz fac schimb de informaie anumit. Pentru modelarea
colaborrii ntre obiecte n limbajul UML se utilizeaz diagramele de secven. Vorbind despre
aceste diagrame se iau n consideraie dou aspecte.
Mai nti, colaborarea ntre obiecte poate fi cercetat n timp i atunci pentru reprezentarea
particularitilor temporale i modului de acceptare a mesajelor se utilizeaz diagrama de
secven.
n al doilea rnd pot fi cercetate particularitile structurale ale colaborrii ntre obiecte. Pentru
reprezentarea particularitilor de transmitere i acceptare a mesajelor ntre obiecte se utilizeaz
diagrama de colaborare.
Ce sunt colectsiile ?
O colectie este un obiect care grupeaza mai multe elemente ntr-o singura unitate.
Tipuri de date reprezentate:
vectori
liste inlantuite
stive
multimi matematice
tabele de dispersie, etc.
Tipul de date al elementelor dintr-o colectie este Object.
Arhitectura colectiilor
Interfete: tipuri abstracte de date.
Implementari: tipuri de date reutilizabile.
Algoritmi polimorifici: functionalitate reutilizabila.
Avantaje:
Reducerea efortului de programare
Cresterea vitezei si calitatii programului
Clase abstracte n Java
O superclas este o generalizare a tipurilor definite prin subclasele sale; de
exemplu, tipul Number este o generalizare a tipurilor clas numerice (Double, Float,
Integer, Short, Byte). Uneori superclasa este att de general nct nu poate preciza
nici variabile si nici implementri de metode, dar poate specifica ce operatii (metode)
ar fi necesare pentru toate subclasele sale. In astfel de cazuri superclasa Java este fie o
clas abstract, fie o interfat.
O metod abstract este declarat cu atributul abstract si nu are implementare. Ea
urmeaz a fi definit ntr-o subclas a clasei (interfetei) care o contine. Metodele
abstracte pot apare numai n interfete si n clasele declarate abstracte.
O clas care contine cel putin o metod abstract trebuie declarat ca abstract, dar
nu este obligatoriu ca o clas abstract s contin si metode abstracte. O clas
abstract nu este instantiabil, dar ar putea contine metode statice utilizabile.
In Java avem dou posibilitti de a defini clase care contin doar metode statice si,
ca urmare, nu pot fi instantiate (nu pot genera obiecte):
- Clase ne-abstracte, cu constructor private, care mpiedic instantierea;

- Clase abstracte, care nici nu au nevoie de un constructor


Spre deosebire de interfete, clasele abstracte pot contine si variabile.
O clas abstract este de multe ori o implementare partial a unei interfete, care
contine att metode abstracte ct si metode definite. Exemplu:
public interface Collection { // declara metode prezente in orice colectie
int size(); // dimensiune colectie
boolean isEmpty(); // verifica daca colectia este goala
// alte metode
}
public abstract class AbstractCollection implements Collection {
public abstract int size(); // metoda abstracta
public boolean isEmpty ( return size()==0;} // metoda implementata

}
Interfete Java
O interfat Java ar putea fi considerat ca o clas abstract care nu contine dect
metode abstracte si, eventual, constante simbolice. Totusi, exist deosebiri importante
ntre interfete si clase abstracte n Java.
Metodele declarate ntr-o interfat sunt implicit publice si abstracte.
De exemplu, interfata mai veche Enumeration contine dou metode comune
oricrei clase cu rol de enumerare a elementelor unei colectii :
public interface Enumeration {
boolean hasMoreElements(); // daca mai sunt elemente in colectie
Object nextElement(); // elementul curent din colectie
}
Enumerarea unor obiecte poate fi privit ca o alternativ la crearea unui vector cu
obiectele respective, n vederea prelucrrii succesive a unui grup de obiecte.
O clas (abstract sau instantiabil) poate implementa una sau mai multe interfete,
prin definirea metodelor declarate n interfetele respective.
Dintre clasele care implementeaz aceast interfat, sunt clasele enumerator pe
vector si enumerator pe un tabel de dispersie Hashtable. Ulterior s-au adugat metode
din aceast interfat si clasei StringTokenizer, care face o enumerare a cuvintelor
dintr-un text:
public class StringTokenizer implements Enumeration {
...
public boolean hasMoreElements() {
return hasMoreTokens();
}
public Object nextElement() {
return nextToken();
}
}

Operatii cu siruri de caractere


1.1 Clasa String
In Java, String este o clasa elementara care ofera functiile de baza pentru manipularea sirurilor
de caractere.
Ca utilizare, aceasta clasa se foloseste pentru compararea a doua siruri de caractere, extragerea
de subsiruri, determinarea lungimii unui sir sau alte operatii care vor fi descrise mai jos.
1.1.1 Instantierea unui obiect String
String str = text;
sau
String str = new String( text );
sau
char data[] = {t, e, x, t}; String str = new String( data );
1.1.2 Cateva operatii uzuale
str.charAt( 1 ) - ntoarce caracterul de la pozitia 1
str.contact( str2 ) - concatenarea de siruri
str.equals( str2 ) - verificarea egalitatii
str.indexOf( str2 ) - determina pozitia de nceput a subsirului str2 n sirul str1
str.length() - determina lungimea sirului
Operatoul + introduce posibilitatea concatenarii de siruri astfel:
str = str1 + str2;
1.2 Clasa StringBuffer
Este asemanatoare cu clasa String, doar ca ofera operatii mai complexe cu ajutorul carora se
poate modifica continutul sirului.
1.2.1 Instantierea unui obiect StringBuffer
StringBuffer str = new StringBuffer( abc );
sau
StringBuffer str = new StringBuffer()
Copierea, clonarea unui obiect consta in obtinerea unui duplicat al unei anumite instante.
Aceasta instanta duplicat va fi identica cu prima in momentul clonarii acesteia (valorile
atributelor).
Spre deosebire de alte limbaje, in Java statement-ul
Clasa c2 = c1;

nu rezulta in realizarea unei copii a obiectului c1, ci in atribuirea aceleiasi referinte amanduror
obiectelor (intrucat Java nu dispune de constructori de copiere impliciti). Asadar, orice
modificare realizata asupra lui c1se va reflecta in c2 si invers.

Java pune la dispozitia dezvoltatorilor o modalitate facila de obtinere a copiilor unui obiect. Cel
mai simplu mod de realizare a clonelor (dar nu neaparat si cel mai elegant) consta in
implementarea interfetei marker Cloneable si suprascrierea metodei Object.clone(..).
Intr-adevar, utilizarea metodei clone(..) in vederea clonarii obiectelor prezinta anumite
dezavantaje. In primul rand, este important de inteles ca interfata Cloneable este o interfata
marker (marker interface). Implementarea efectiva a functionalitatii se face suprascriind
(override) metoda Object.clone(). Asadar, sunt doua elemente ce trebuie luate in calcul:
implementarea unei (anumite) interfete si suprascrierea unei metode (apartinand unei alte clase).
Unul dintre principalele dezavantaje este imposibilitatea apelarii acestei metode cand sunt
implementate interfete. Intrucat metoda clone(..) apartine clasei Object, este necesara
specificarea prototipului acesteia in orice interfata, incalcand astfel principiul incapsularii si
marind nivelul de duplicare al codului.
De asemenea, aceasta structura (marker + overriding) complica treaba cand vine vorba de
implementare a functionalitatii de clonare a claselor 3rd party, intrucat este necesara
suprascrierea clone() in intreaga ierarhie a claselor.
In cazul in care dezavantajele utilizarii clone(..) par a prezenta un obstacol serios in calea scrierii
de cod corect, exista o serie de modalitati alternative de realizare a clonelor obiectelor ce pot fi
luate in calcul. Una dintre aceste alternative la utilizarea metodei clone(..) ar fi folosirea
capacitatilor de serializare (Serializable API) ale Java. Utilizand aceasta modalitate, este posibila
realizarea deep copy-urilor intr-un mod elegant. De asemenea, o alta alternativa demna de luat in
calcul ar fi utilizarea unui constructor de copiere (copy constructor).

Compozitia
Compoziia este procesul de construire a unei clase prin adugarea n cadrul acesteia a unuia sau
mai multor obiecte.
EXEMPLU:
class TV{
RemoteControl rc;
Display d;
ElectronicBoard eb;
booleab state
int size;
....
void turnOn(){...}
void turnOFF(){...}
}

EXEMPLU:
class Persoana{
String nume;
Adresa adresa;
...
}
n exemplele anterioare clasele TV i Persoana conin referine ctre alte obiecte i exemplific
conceptul de compoziie.

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