Documente Academic
Documente Profesional
Documente Cultură
10.
try {
// codul care este susceptibil sa genereze exceptie
} catch (Type1 tp1) {
// exceptii de tipul Type1
} catch (Type2 tp2) {
// exceptii de tipul Type2
3
}
finally {
// cod care se executa indiferent de tipul de exceptie aruncat (sau nu)
}
Try catch functioneaza ca un switch pe tipul de exceptie
2 modalitati de tratare a erorilor
Termination: eroarea este aruncata
Resumption: se insereaza cod try catch pt rezolvarea erorii
Blocul "try" contine instructiunile de deschidere a unui fisier si de citire dintr-un fisier
ambele putnd produce exceptii. Exceptiile provocate de aceste instructiuni sunt tratate
n cele doua blocuri "catch", cte unul pentru fiecare tip de exceptie.
Inchiderea fisierului se face n blocul "finally", deoarece acesta este sigur ca se va
executa. Fara a folosi blocul "finally" nchiderea fisierului ar fi trebuit facuta n fiecare
situatie n care fisierul ar fi fost deschis, ceea ce ar fi dus la scrierea de cod redundant:
11.
Descrieti modulele de creare a obiectelor din tipul claselor
interioare care nu sunt anonimie
Clasa interioar este necesar numai clasei exterioare. Pentru reducerea numrului de
clase de nivel superior si pentru simplificarea comunicrii ntre clasele asculttor la
evenimente putem defini clasele receptor ca niste clase interioare cu nume, incluse n
clasa cu fereastra aplicatiei:
class MFrame extends JFrame {
JButton b1 = new JButton (" + ");
JButton b2 = new JButton (" - ");
JTextField text = new JTextField (6);
int n= 0;
public MFrame() {
Container c = getContentPane();
b1.addActionListener (new B1L());
b2.addActionListener (new B2L());
c.setLayout (new FlowLayout());
c.add(b1); c.add(b2);
text.setText(" "+n);
c.add (text);
}
// clase incluse cu nume
class B1L implements ActionListener {
public void actionPerformed (ActionEvent ev) {
text.setText(" "+ ++n);
4
}
}
class B2L implements ActionListener {
public void actionPerformed (ActionEvent ev) {
text.setText(" "+ --n);
}
}
Definirea de clase incluse anonime reduce si mai mult lungimea programelor, dar
ele sunt mai greu de citit si de extins
12.
Fie un system formal definit pe alfabetul format din literele a si b.Limbajul
format accepta doar cuvinte care se incheie cu aab.Sa se scrie automatul finit
determinist pentru acest limbaj si reprezentarea limbajului in BNF.
13.
Descrieti modaliatea de realizare a unui iterator si incercati sa
furnizati un exemplu concret de utilizare a acestui sablon de programare
Un iterator este un obiect care permite traversarea unei colectii si
modificarea acesteia (ex: stergere de elemente) in mod selectiv. Puteti obtine un
iterator pentru o colectie, apeland metoda sa iterator(). Interfata Iterator este
urmatoarea:
public interface Iterator<E> {
boolean hasNext();
E next();
void remove(); // optional
}
Metodele au urmatorul comportament:
hasNext -intoarce true daca mai exista elemente neparcurse inca de iteratorul
respectiv
next -intoarce urmatorul element
remove -elimina din colectie ultimul element intors de next. In mod evident,
remove nu poate fi apelat decat o singura data dupa un apel next. Daca aceasta
regula nu este respectata, vom primi o eroare.
Ne putem imagina ca un iterator se pozitioneaza intre elementele colectiei. Initial,
cursorul sau precede primul element, astfel ca primul apel next va intoarce primul
element.
Atentie: Metoda remove este singura modalitate SIGURA de a inlatura un element
dintr-o colectie in timpul parcurgerii acesteia. Orice alta metoda are un
comportament neprecizat (nu putem garanta ca stergerea va avea loc, sau ca
elementul sters va fi cel pe care chiar doream sa-l stergem).
Este util sa folosim iteratori cand dorim: stergerea elementului curent, in timpul
iterarii
5
16.
Care este diferenta intre colectiile generice, heterogene si
parametrizate?
Colectiile sunt un ansamblu de iterfete si clase ce realizeaza: colectarea impreuna
a obiectelor, stocarea, sortarea si accesarea obiectelor.
Colectii generice putem specifica tipul de data pe care il va folosi colectia,
ex: List<String> strings
6
Suprancrcarea
Suprancrcarea unei metode (owerloading) este procesul prin care n cadrul unei
clase sunt adugate dou sau mai multe metode cu acelai nume dar cu numr diferit
de parametri. n momentul apelrii metodei, mediul de rulare va ti exact ce metod
s apeleze pe baza parametrilor specificai astfel nct nu exista posibilitate de
confuzie si de apelare a unei metode greite.
7
20.
Cuvntul cheie this
Cuvntul cheie this este folosit n cadrul metodelor atunci cnd se dorete s se aib
acces la referina obiectului curent. Cuvntul cheie this este o referin ctre obiectul
curent. Acest cuvnt cheie este folosit doar n cazurile speciale cnd este nevoie s se
fac o referin explicit la obiectul curent. De exemplu n cazul unei metode care
trebuie s returneze obiectul curent.
21.
Cuvntul cheie static este folosit n java pentru a defini o variabil sau o metod care
poate fi accesata prin intermediul numelui clasei, fr a fi nevoie s se construiasc
obiecte de tipul respectiv. n construirea unei aplicaii orientate pe obiecte utilizarea
atributelor sau metodelor statice trebuie s fie evitat i acestea s fie folosite doar n
cazuri de strict necesitate.
22.
Clase i metode abstracte
o metod se numete abstract dac este doar declarat i nu definit. Declaraia
va conine, obligatoriu, cuvntul cheie abstract: abstract numemetoda ();
o clas ce conine mcar o metod abstract devine clas abstract i va trebui
calificat ca atare (n caz contrar se produce o eroare de compilare). Fiind o clas
incomplet, tentativa de a crea un obiect de tip abstract, se soldeaz cu eroare.
23.
Interfaa
Interfaa acoper noiunea de clas abstract pur. n aceast situaie definiia tipului
este precedat de cuvntul cheie interface, ce va nlocui cuvntul cheie class.
Prin interfa se pune la dispoziie o form i nu o implementare. Ea poate conine:
ierarhii; Procesor se creaza ca si o interfata, iar clasele care doresc sa faca parte din
strategie vor implementa interfata scrisa
Design patternul Adapter:
-se scrie cod care preia la intrare interfata existenta si care sa produca interfata de care
este nevoie in program; -Prin decuplarea interfetei de implementare se permite ca o
interfata sa fie aplicata mai multor implementari, deci codul devine mult mai facil de
reutilizat
Design patternul FactoryMethod:
-in loc sa se apeleze un constructor in mod direct, pentru crearea unui obiect se
apeleaza o metoda de creere a obiectului dintr-o clasa Factory. Clasa Factory
implementeaza o interfata care specifica metoda de creere;
-Astfel, se poate schimba
la runtime o implementare a unei functionalitati cu alta
Control frameworks: -Application framework: un set de clase proiectate sa rezolve un
tip anume de problem (design patternul Template Method); -Pentru aplicarea
application framework se mostenesc din clasele de baza si se schimba implementarea
prin overriding; -Codul suprascris este cel care customizeaza solutia la cazul particular;
-Template Method: contine structura de baza a algoritmului, iar partile specifice sunt
apeluri la metode care pot fi override; -Astfel, se separa partile neschimbate ale
algoritmului de cele flexibile; -Control framework: un tip particular de application
framework prin care sistemul raspunde la evenimentele generate (sistem event-driven)
de exemplu GUIs; -In implementarea Control framework, inner class sunt utilizate pentru
a exprima diversele actiuni (metoda action)
Design patternul Decorator:
-Decoratorul trebuie sa aiba aceasi interfata cu obiectele decorate; -Decoratorul poate
s extinda interfata acestor obiecte; -Clasele Filter sunt radacina abstracta a claselor de
decorator
Obiect: un obiect are o stare, un comportament si o identitate
Clas: set de obiecte cu caracteristici i funcionalitate identice (termenul de clasa se
substituite termenului de tip)
Intefaa: metode (funcionalitate): cererile care pot fi adresate unui obiect particular
dintr-o clasa
Implementarea: mod concret de realizare a funcionalitii
Motenire: o clas nou se aseamn (extinde) o clas existent
Mostenire cum se diferentiaza clasa derivata de clasa de baza? -Prin adaugare
de noi metode suplimentare; -Schimbarea comportamentului unor metode existente in
clasa de baza (overriding); -Relatia is-a: clasa derivata doar override metode din clasa de
baza (principiul substitutiei pure); -Relatia is-like-a: clasa derivata adauga elemente noi
interfetei clasei de baza (metodele noi nu sunt accesibile din clasa de baza substitutia
nu mai este pura)
Mosternirea multipla: -In Java se poate extinde o singura clas si se pot implementa
oricate clase; -Rolul interfetelor: sa se poata face upcast la mai mult decat o clasa de
baza; Daca se poate crea o clasa de baza fara definitii de metode si variabile membre, se
recomanda sa se creeze interfete in locul claselor abstracte; -Interfetele se pot combina
(se extinde interfetele la fel ca si clasele); -Coliziunea numelor la implementarea mai
multor interfete (daca interfetele de baza au acelasi nume de metoda cu semnaturi
diferite): este o problema daca metodele difera doar prin tip de return => eroare la
compilare; -Campurile care sunt inserate intr-o interfata devin in mod automat statis si
final => reprezinta un mod convenabil pentru a defini constante (similar cu enum);
-Campurile definite in interfete nu pot fi blank finals, ele trebuie initializate la definire
Containere: Necesare datorita faptului ca nu stim de la design numarul de obiecte
necesare pentru a rezolva o anumita problema; -Containerele sunt siruri de referinte
catre alte obiecte; -Ele se expandeaza automat pentru a salva noi obiecte, dupa
necesitati; -2 tipuri de liste: ArrayList, LinkedList; -Containerele in Java sunt create sa
pastreze obiecte de tipul Object. -> ele pot salva orice; -Pot aparea exceptii la Downcast
la runtime, timp de executie crescut datorit operaiei de Downcast
Crearea obiectelor si ciclul de viata:
-Fiecare obiect necesita resurse (memorie), crearea si distrugerea obiectelor devin
importante; -Java utilizeaza in mod exclusiv alocarea dinamica a memoriei; -Pentru orice
obiect, trebuie utilizat new la creeere; -Obiectele sunt alocate in zona de heap;
-Distrugerea obiectelor este realizata automat de catre garbage collector; -GC identific
momentul in care un obiect nu mai este utilizat i il dezaloc
Organizarea memoriei in Java: -Zona Registru: registrele procesorului, nu avem
access direct la ele; -Stiva: zona de stiva memoreaza referintele catre obiecte; -Heap: in
aceasta zona sunt alocate toate obiectele (la apelul new); -Spatiu de stocare nonRAM: obiecte care exista in afara spatiului de memorie a programului (persistenta
obiectelor)
Siruri (Arrays) in Java; -limbaj de programare orientat safety; -La crearea unui Array se
creaza un sir de referinte fiecare initializata la valoarea null; - => fiecare membru al
sirului trebuie initializat; -Java nu permite utilizarea unui indice in afara range-ului arrayului (se arunca o exceptie)
Clase::
class ATypeName { /* class body */}Clasele contin:-Campuri; -Metode Modul de
accesare a unui camp/metoda objectReference.member Pentru datele din tipuri
primitive se garanteaza initializarea la valori implicite (false si 0)Metode, argumente si
tip de return ReturnType methodName(/* argument list */) { /* method body*/}
Operatori:
-Toti operatorii produc o valoare prin aplicarea lor; -Ei pot produce si side-effects
(modificarea valorii operanzilor); -Aliasing: la transmiterea unui obiect ca si argument
intr-o metoda, se transmite o referinta, deci modificarea valorii in metoda afecteaza
valoarea obiectului din afara metodei; -Operatorii ++ si au forma postfixata si
prefixata; -Operatorii == si =! Aplicati pe referinte de obiecte, compara referintele, si nu
continutul obiectelor
Garbage collector-ul dezaloca memoria alocata prin new, atunci cand obiectele nu mai
sunt folosite; -colecteaza memoria ramasa alocata in obiectele care nu mai sunt utilizate
si compacteaza heap-ul, rearanjand obiectele alocate; -Stop-and-copy: GC-ul opreste
programul, scaneaza toate referintele de pe stack si copiaza obiectele identificate in noul
10
heap. Ceea ce ramane e garbage-ul care trebuie dezalocat, iar noul heap e deja
compactat
Metoda finalize: -permite operatii de stergere inainte ca obiectele sa fie supuse
garbage collectorului; -Java nu garanteaza apelarea acestei metode, programatorul nu
are control asupra momentului cand se apeleaza garbage collectorul; -Finalize se
utilizeaza in general pentru a implementa termination conditions pentru un obiect (de
exemplu inchiderea unui fisier)
Specificatorii de access public, private, protected:
-Access la nivel de package: accesul implicit al membrilor care nu au nici un specificator;
-Pentru clasele din afara package-ului, acesti membrii sunt considerati private; -Access
public: orice clasa de oriunde poate accesa membrul respective; -Clasele mostenite: pot
accesa membrii protected din clasa de baza, ca si cum acestia ar fi membrii public;
-Membrii private: pot fi accesati doar in clasa in care au fost definite; -Interfata claselor:
public;
-Implementarea functionalitatilor: private
Sintaxa mostenirii:
-Mostenirea se realizeaz ori de cte ori se creaz o clas: se motenete din Object;
-Mostenire: clasa nou se aseamn cu clasa veche: cuvntul cheie extends; -Clasa nou
va prelua automat toate campurile i metodele din clasa de baz; -Regul nescris la
mostenire: cmpurile din clasele de baz se scriu private iar metodele se las public (sau
protected);
-Clasa derivat poate s preia o metod din clasa de baz si s o
rescrie; -Din clasa derivat, pentru a se apela o metod din clasa de baz se poate utiliza
super; -Realizarea mostenirii: la crearea obiectului din clasa derivat, se creaz un
subobiect din clasa de baz (ca si cum ar fi realizat o compozitie ctre acesta);
-Initializarea subobiectului din clasa de baz: doar prin constructor;
-Constructorul
clasei de baz este apelat intotdeauna inaintea constructorului clasei derivate; -Pentru
apel constructor al cl de baz cu argumente: super ( argumente)
Final:
itemii final: nu pot fi schimbate ( de exemplu, intr-o clas derivata); -Datele final:
Constante la compilare care nu se schimba ulteriorValori initializate la runtime care nu se
doreste sa fie schimbateStatic final: au o singur locatie de stocare a datei; -Final aplicat
la o referinta: face referinta constant, valoarea obiectului poate fi modificata; -Blank
final: campuri declarate final care nu sunt initializate -> ele trebuie initializate inainte de
utilzare; -Argumente final: n metod nu se poate schimba valoarea ctre care arat
referinta; -Metode final: nu pot fi schimbate prin mostenire; -Metodele final sunt tratate
inline de ctre compilator; -Clase final: se inhib mostenirea din clasa respectiv
Mecanismul upcast:
-Asocierea dintre numele metodei si corpul metodei legare (binding); -Early binding:
atunci cand legarea se face la compilare; -Late binding: atunci cand legarea se face la
executie, exact inainte de executia efectiva a metodei; -Late binding = dynamic binding
sau runtime binding; -Late binding: necesit un mecanism pentru identificarea tipului la
executie (RTTI) pentru a se identifica in mod corect corpul metodei care trebuie apelat;
-In Java se utilizeaza late binding pentru orice apel de metod, cu exceptia metodelor
static si final (private e implicit final pt ca o metoda private nu poate fi mostenita);
-Campurile si elementele static sunt rezolvate la compilare; -Legarea constructorilor este
realizata la compilare
Is-a vs. Is-like-a:
11
-Relatie de mostenire de tip is-a: clasa derivat doar suprascrie interfaa clasei de baz;
-Relatie de mostenire de tip is-like-a: clasa derivat contine metode suplimentare fa de
clasa de baz; -Relaia de substituie: La o relatie de tip is-a substitutia este pur: orice
mesaj trimis clasei derivate poate fi trimis si clasei de baz (rezolvarea mesajului se face
prin upcast) La o relaie de tip is-like-a: partea extins din clasa derivat nu mai este
disponibil prin upcast (prin adresarea clasei de baz);
-Downcast: operaia invers
upcast nu este o operaie garantat, in sensul in care nu stim exact clasa derivat
ctre care se face downcast; -Java verific orice conversie (cast), si daca nu se poate
realiza se arunc o exceptie de tipul ClassCastException
Clase abstracte:
-Rolul clasei Instrument (varful ierarhiei): s creeze o interfa comun claselor derivate;
- => obiectele din clasa Instrument nu au sens (dpdv logic); - => clasa Instrument: clas
abstract; -Pentru a evita astfel de erori la executie exist un mecanism prin care se
declar clasele abstracte: cuvantul cheie abstract; -Clas abstract: are cel putin o
metod abstract (metod declarat abstract si care nu are corp); -Se genereaz eroare
la compilare dac se incearc crearea unui obiect dintr-o clas abstract; -La mostenire
dintr-o clas abstract, metoda abstract trebuie suprascris, altfel clasa derivat devine
si ea abstract
Inner classes:
-Se plaseaza clase in interiorul altor clase; -Inner classes reprezinta un concept diferit de
compozitie; -De obicei, clasa exterioara are o metoda care returneaza un obiect din clasa
inner; -Tipul obiectului din clasa interioara se specifica precum: OuterClass.InnerClass;
-Obiectul clasei interioare are un link (referinta) catre obiectul clasei exterioare care l-a
creat; -Obiectul clasei interioare poate accesa membrii obiectului clasei exterioare fara
ca sa fie nevoie de calificare (dreptul de a accesa este asupra tuturor obiectelor membre
ale clasei exterioare; -Pentru a se obtine referinta la obiectul clasei exterioare (din
obiectul clasei inner) se utilizeaza: OuterType.this ; -Pentru a crea un obiect din clasa
inner pornind de la un obiect din clasa outer se poate utiliza: obiectOuter.new ;- Clasele
inner sunt potrivite pentru a implementa interfete: se realizeaza ascunderea
implementarii
Closures & callbacks:
Closure: un obiect apelabil care retine informatie despre domeniul de vizibilitate in care
a fost creat (are access la variabilele din domeniul de vizibilitate unde a fost creat); -=>
clasa interioara este un closure (deoarece are o referinta catre obiectul exterior si poate
sa acceseze inclusiv membrii privati ai clasei exterioare)
Callback: un obiect primeste o informatie care va permite sa apelam obiectul initial la
un moment ulterior de timp. Se implementeaza cu clase interioare. Clasa de tip Closure
furnizeaza o poat n intriorul clasei exteriore (dar intr-un mod safe nu se necesit ca
sa transformam accesul la metodele acestei clase)
Iteratori:Este un design pattern; -Un obiect de tip iterator este asociat unei colectii si permite
regasirea ordonata a obiectelor din colectia respective; -Metoda iterator() a unei colectii;
-Metoda next() a obiectului iterator: produce urmatorul element din colectie; -Metoda
hasNext(): interogheaza daca mai sunt elemente neiterate; -Metoda remove(): sterge
ultimul element iterat din colectie; -Iteratorii pot produce elementele colectiei doar intr-o
singura directive; -ListIterator: furnizat doar de interfata List, poate parcurge elementele
colectiei in ambele directii
12
Procesor se creaza ca si o interfata, iar clasele care doresc sa faca parte din
strategie vor implementa interfata scrisa
Design patternul Adapter:
1 Se scrie cod care preia la intrare interfata existenta si care sa produca interfata de
care este nevoie in program;
2 Prin decuplarea interfetei de implementare se permite ca o interfata sa fie aplicata
mai multor implementari, deci codul devine mult mai facil de reutilizat
Design patternul FactoryMethod:
1 In loc sa se apeleze un constructor in mod direct, pentru crearea unui obiect se
apeleaza o metoda de creere a obiectului dintr-o clasa Factory. Clasa Factory
implementeaza o interfata care specifica metoda de creere;
2 Astfel, se poate schimba la runtime o implementare a unei functionalitati cu alta
Control frameworks:
1 Application framework: un set de clase proiectate
2 Schimbarea
comportamentului
unor
metode
existente
in
clasa
de
baza
(overriding);
3 Relatia is-a: clasa derivata doar override metode din clasa de baza (principiul
substitutiei pure);
4 Relatia is-like-a: clasa derivata adauga elemente noi interfetei clasei de baza
(metodele noi nu sunt accesibile din clasa de baza substitutia nu mai este pura)
Crearea obiectelor si ciclul de viata:
1 Fiecare obiect necesita resurse (memorie), crearea si distrugerea obiectelor devin
2
3
4
5
6
importante;
Java utilizeaza in mod exclusiv alocarea dinamica a memoriei;
Pentru orice obiect, trebuie utilizat new la creeere;
Obiectele sunt alocate in zona de heap;
Distrugerea obiectelor este realizata automat de catre garbage collector;
GC identific momentul in care un obiect nu mai este utilizat i il dezaloc
Static:
1 Datele membre si metodele pot fi accesate doar sub calificarea unui obiect
cunoscut, existent in memonia programului (creat cu new).
2 Un camp sau o metoda statica nu este legata de un obiect anume dintr-o clasa;
3 Un camp static exista o singura data pentru o clasa, fiind partajat de catre toate
obiectele clasei respective;
4 Campurile statice pot fi referite prin numele clasei;
5 Metodele statice sunt la nivel de clasa, pot fi referite prin numele clasei fara a fi
necesara existenta unui obiect;
6 Metoda main;
7 Metodele statice nu pot accesa campuri/ metode nestatice din clasa.
8 Blocul static este apelat o singura data, la prima creare a unui obiect din clasa
respectiva sau la apelarea unei membre statice din acea clasa si poate sa
initializeze doar date statice.
Operatori:
1 Toti operatorii produc o valoare prin aplicarea lor;
2 Ei pot produce si side-effects (modificarea valorii operanzilor);
3 Aliasing: la transmiterea unui obiect ca si argument intr-o metoda, se transmite o
referinta, deci modificarea valorii in metoda afecteaza valoarea obiectului din afara
metodei;
4 Operatorii ++ si au forma postfixata si prefixata;
16
Garbage collector-ul:
1 dezaloca memoria alocata prin new, atunci cand obiectele nu mai sunt folosite;
2 colecteaza memoria ramasa alocata in obiectele care nu mai sunt utilizate si
compacteaza heap-ul, rearanjand obiectele alocate; -Stop-and-copy:
3 GC-ul opreste programul, scaneaza toate referintele de pe stack si copiaza
obiectele identificate in noul heap. Ceea ce ramane e garbage-ul care trebuie
dezalocat, iar noul heap e deja compactat
Sintaxa mostenirii:
1 Mostenirea se realizeaz ori de cte ori se creaz o clas: se motenete din
Object;
2 Mostenire: clasa nou se aseamn cu clasa veche: cuvntul cheie extends;
3 Clasa nou va prelua automat toate campurile i metodele din clasa de baz;
4 Regul nescris la mostenire: cmpurile din clasele de baz se scriu private iar
metodele se las public (sau protected);
5 Clasa derivat poate s preia o metod din clasa de baz si s o rescrie;
6 Din clasa derivat, pentru a se apela o metod din clasa de baz se poate utiliza
super;
7 Realizarea mostenirii: la crearea obiectului din clasa derivat, se creaz un
subobiect din clasa de baz (ca si cum ar fi realizat o compozitie ctre acesta);
8 Initializarea subobiectului din clasa de baz: doar prin constructor;
9 Constructorul clasei de baz este apelat intotdeauna inaintea constructorului clasei
derivate;
10 Pentru apel constructor al cl de baz cu argumente: super ( argumente)
Sintaxa compoziiei:
1 Se plaseaz o referin ctre un obiect nou ntr-o clas nou
2 Referintele nou create se initializeaz la valoarea null -> trebuie initializate
explicit
Operatia de delegare:
1 Operatie intermediar intre compozitie si agregare
2 Intr-o clas se plaseaz un obiect membru din a 2-a clas, iar clasa nou va
expune toate metodele furnizate de obiectul din clasa 2-a
17
Mecanismul upcast:
1 Asocierea dintre numele metodei si corpul metodei legare (binding);
2 Early binding: atunci cand legarea se face la compilare;
3 Late binding: atunci cand legarea se face la executie, exact inainte de executia
efectiva a metodei;
4 Late binding = dynamic binding sau runtime binding;
5 Late binding: necesit un mecanism pentru identificarea tipului la executie (RTTI)
pentru a se identifica in mod corect corpul metodei care trebuie apelat;
6 In Java se utilizeaza late binding pentru orice apel de metod, cu exceptia
metodelor static si final (private e implicit final pt ca o metoda private nu poate fi
mostenita);
7 Campurile si elementele static sunt rezolvate la compilare;
8 Legarea constructorilor este realizata la compilare
Is-a vs. Is-like-a:
1 Relatie de mostenire de tip is-a: clasa derivat doar suprascrie interfaa clasei de
baz;
2 Relatie de mostenire de tip is-like-a: clasa derivat contine metode suplimentare
fa de clasa de baz;
3 Relaia de substituie: La o relatie de tip is-a substitutia este pur: orice mesaj
trimis clasei derivate poate fi trimis si clasei de baz (rezolvarea mesajului se face
prin upcast) La o relaie de tip is-like-a: partea extins din clasa derivat nu mai
este disponibil prin upcast (prin adresarea clasei de baz);
4 Downcast: operaia invers upcast nu este o operaie garantat, in sensul in care
nu stim exact clasa derivat ctre care se face downcast;
5 Java verific orice conversie (cast), si daca nu se poate realiza se arunc o exceptie
de tipul ClassCastException
Containere:
1 Necesare datorita faptului ca nu stim de la design numarul de obiecte necesare
pentru a rezolva o anumita problema;
2 Containerele sunt siruri de referinte catre alte obiecte;
3 Ele se expandeaza automat pentru a salva noi obiecte, dupa necesitati;
4 2 tipuri de liste: ArrayList, LinkedList;
18
5 Containerele in Java sunt create sa pastreze obiecte de tipul Object. -> ele pot
salva orice;
6 Pot aparea exceptii la Downcast la runtime, timp de executie crescut datorit
operaiei de Downcast
Cuvantul cheie this:
1 In fiecare metoda apelata, referinta obiectului sub care se apeleaza metoda este
transmisa in metoda sub forma referintei this
2 this poate fi utilizat doar in interiorul metodelor ne-statice
3 In interiorul unei metode dinstr-o clasa, la apelul unei metode din clasa curenta, nu
este nevoie sa se utilizeze this
4 This este frecvent utilizat in return, pentru a returna obiectul curent
Clase abstracte:
1 Dintr-o clasa abstracta nu se poate instantia nu se poate instantia si foloseste doar
2
3
4
5
6
Interfete:
1 Se implementeaza si metodele nu au bloc;
2 O clasa care implementeaza o interfata
trebuie
obligatoriu
sa
specifice
19
3 Daca se poate crea o clasa de baza fara definitii de metode si variabile membre, se
recomanda sa se creeze interfete in locul claselor abstracte; -Interfetele se pot
combina (se extinde interfetele la fel ca si clasele);
4 Coliziunea numelor la implementarea mai multor interfete (daca interfetele de
baza au acelasi nume de metoda cu semnaturi diferite): este o problema daca
metodele difera doar prin tip de return => eroare la compilare;
5 Campurile care sunt inserate intr-o interfata devin in mod automat statis si final
=> reprezinta un mod convenabil pentru a defini constante (similar cu enum);
6 Campurile definite in interfete nu pot fi blank finals, ele trebuie initializate la
definire.
Inner classes:
1
2
3
4
5
l-a creat;
6 Obiectul clasei interioare poate accesa membrii obiectului clasei exterioare fara ca
sa fie nevoie de calificare (dreptul de a accesa este asupra tuturor obiectelor
membre ale clasei exterioare;
7 Pentru a se obtine referinta la obiectul clasei exterioare (din obiectul clasei inner)
se utilizeaza: OuterType.this ;
8 Pentru a crea un obiect din clasa inner pornind de la un obiect din clasa outer se
poate utiliza: obiectOuter.new ;
9 Clasele inner sunt potrivite pentru a implementa interfete: se realizeaza
ascunderea implementarii
Clase interioare anonime:
1 Sunt clase interioare fara nume (clase create direct la momentul utilizarii lor)
2 finalizeaza constructia instructiunii care contine definitia clasei anonime
3 Campurile din clasele anonime pot fi initializate cu valori din afara (din domeniul
unde se creaza clasa)
4 Daca intr-o clasa anonima se doreste a fi utilizat un argument (sau o valoare)
definita in afara acesteia, atunci referinta acesteia trebuie sa fie final
5 Clasele anonime nu pot avea constructor, dar initializarile se pot realiza in blocul
non-static de initializare
20
6 Clasele interioare pot fi create static (nested classes) daca nu se doreste utilizarea
referintei obiectului exterior in interiorul clasei inner
7 Clasele interioare parte a unei interfete devin automat static public. Rol: crearea de
cod comun care sa fie utilizat de toate implementarile interfetei
8 Oricat de adanca este imbricarea claselor nested, acestea pot accesa obiectele
membre din clasele exterioare, indiferent de nivelul de imbricare
9 La mostenire dintr-o clasa inner, trebuie furnizat la constructia obiectului un obiect
din clasa inner, pentru a se permite construirea sub-obiectului cl. baza
( enclosingClassReference.super() )
10 Clasele locale unui domeniu de vizibilitate au access la toate variabilele domeniului
respectiv (inclusiv cele final), insa aceste clase nu au specificator de access
Closure:
Callback:
Iteratori:
1 Este un design pattern;
2 Un obiect de tip iterator este asociat unei colectii si permite regasirea ordonata a
3
4
5
6
7
8
Obiectul Class:
21
Clasa File:
1 Reprezinta un nume a unui fisier sau unui set de fisiere dintr-un director;
2 Metoda list() -> produce un sir de String care reprezinta fisierele referite de
obiectul de tip File;
3 List poate fi invocata utilizand un Directory Filter, pentru a returna doar acele
fisiere pentru care numele respecta un pattern;
4 Interfata FilenameFilter: metoda accept primeste la intrare obiectul de tip File si
stringul pentru comparare. Metoda list din File apeleaza metoda accept pentru
fiecare fisier din File, iar acesta este inserat in lista doar daca accept furnizeaza
true;
5 Obiectul File poate fi utilizat ca sa creem/stergem/redenumim un director/fisier sau
un director/fisier cu o intreaga cale;
6 -File poate fi utilizat ca sa citim informatiile referitoare la un fisier/director
Input si Output:
1 Pentru intrare: clasele InputStream si Reader cu metoda read;
2 Pentru iesire: clasele OutputStream si Writer cu metoda write;
3 Read si write lucreaza pe octeti (sau siruri de octeti);
22
4 Toate clasele de I/O sunt derivate din acestea; -La realizarea efectiva de I/O
programatorii creaza insuruiri de obiecte din clasele de I/O (design patternul
Decorator)
Tipuri de InputStream:
1 ByteArrayInputStream: permite ca un buffer de memorie sa fie utilizat ca si un
InputStream (din buffer se extrag octeti);
2 StringBufferInputStream: converteste un String intr-un InputStream;
3 FileInputStream: sursa de intrare e un fisier. Se furnizeaza la construirea obiectului
fie un String fie un File;
4 PipedInputStream: este asociat cu un PipedOutputStream (care este furnizat la
construirea obiectului). Implementeaza conceptul de Pipe;
5 SequenceInputStream: converteste unul sau mai multe InputStream intr-un singur
obiect de tip InputStream (la construire se furnizeaza fie un InputStream, fie un
Enumerator de obiecte InputStream);
6 FilterInputStream: clasa abstracta, interfata pentru decoratorii care furnizeaza
tipuri particulare de citire
Tipuri de OutputStream:
1 ByteArrayOutputStream: creaza un buffer de memorie (octeti). Datele scrise sunt
trimise in acest buffer;
2 FileOutputStream: iesire intr-un fisier. Se construieste obiectul pe baza unui String
sau a unui File;
3 PipedOutputStream: in conjunctie cu PipedInputStream. Pentru conceptul de Pipe;
4 FilterOutputStream: pentru iesire formatata, se implementeaza functionalitati de
scriere
Reader si Writer:
1 Adauga functionalitate pentru I/O la nivel de caracter sau Unicode;
2 Clasele sunt adaugate in ierarhia InputStream si OutputStream deci nu se
inlocuieste aceasta ierarhie;
3 Clase adapter: InputStreamReader si OutputStreamWriter;
4 Motivul pentru care au fost create: sa se permita internationalizarea (Unicode
lucreaza cu caractere pe 16 biti);
5 Recomandare: sa se utilizeze clase de tip Reader si Writer ori de cate ori e posibil;
23
Externalize:
1 extinde interfata Serializable;
2 La obiectele deserializate cu Externalizable, obiectele sunt construite obisnuit (cu
default constructor) si apoi se apeleaza metoda readExternal;
3 La obiectele Externalizable, subobiectele componente trebuie serializate manual
(in writeExternal) iar la deserializare, ele trebuie recuperate de pe disc;
4 La mostenire dintr-o clasa Externalizable, se apeleaza writeExternal si readExternal
a clasei de baza pentru a se asigura serializare / deserializare corecta
RTTI:
1 Run-Time Type Identification
2 Descoperirea tipului la executie si utilizarea acestuia
3 2 tipuri de RTTI:
-Traditional la compilare
-Reflection: - la executie !!!
4 Upcast: necesit realizarea automata a RTTI pentru
invocarea
automat
24
Final:
1 declara ca o clasa nu poate accesa subclase
2 declararea are 2 scopuri:
securitate : unele metode pot astepta ca parametru un obiect al unei clase si nu al
unei sublcase, dar tipul exact al unui obiect nu poate fi aflat cu exactitate decat in
momentul executiei
programare in spirit orientat obiect: o clasa perfecta nu trebuie sa aiba subclase
Finalize:
Clauza throw:
Polimorfism:
1
2
Organizarea codului:
1
2
3
4
Iteratorul extern este controlat de client, ca n exemplul precedent (cu metoda next)
Iteratorul intern este controlat de Iteratorul nsui, cruia trebuie s i se spun ce
operaii s efectueze cu elementele pe care le parcurge
ablonul se utilizeaz pentru:
A accesa coninutul unui obiect agregat fr a expune reprezentarea intern
A asigura suport pentru mai multe traversri ale obiectelor agregate
A furniza o interfa uniform pentru traversarea structurilor agregate diferite
Pentru a suporta o iteraie polimorfic
28