Documente Academic
Documente Profesional
Documente Cultură
.class ............................................................................................................................................................. 2
CLASSPATH................................................................................................................................................ 2
Diferenta dintre compilarea in C si compilarea in Java. ............................................................................... 3
Obiect – in Java ............................................................................................................................................. 3
Clasa (Ce este o clasa in Java) ...................................................................................................................... 3
Organizarea memoriei in Java ....................................................................................................................... 3
Primitivele ..................................................................................................................................................... 4
Specificatori de access .................................................................................................................................. 4
Variabile........................................................................................................................................................ 4
Static (static keyword – cuvantul cheie static) .............................................................................................. 4
Constructor.................................................................................................................................................... 5
Overloading (Supraincarcarea) ..................................................................................................................... 5
This (cuvantul cheie this) .............................................................................................................................. 6
Distrugerea obiectelor (GARBAGE COLLECTOR) .................................................................................... 6
Finalize() ....................................................................................................................................................... 6
Bloc static...................................................................................................................................................... 6
Compozitie. ................................................................................................................................................... 7
Mostenirea..................................................................................................................................................... 7
SUPER (cuvantul cheie super)...................................................................................................................... 8
DELEGAREA............................................................................................................................................... 8
FINAL ........................................................................................................................................................... 9
Blank final..................................................................................................................................................... 9
Upcast ........................................................................................................................................................... 9
BINDING ................................................................................................................................................... 10
Covariant return types ................................................................................................................................. 10
Clasele abstracte.......................................................................................................................................... 10
Interfata ..................................................................................................................................................... 11
Polimorfism ................................................................................................ 11
Dispose() .........................................................................................................................11
Design pattern Strategy (D.P Strategy) ....................................................................................................... 11
Design pattern Adapter ......................................................................................................12
Mostenirea multipla ...........................................................................................................12
Design pattern Factory Method ...........................................................................................12
Clase inner .......................................................................................................................12
De ce inner class? ..............................................................................................................13
Clase interioare anonime ....................................................................................................13
Closure ............................................................................................................................13
Callback ...........................................................................................................................14
Mostenire in clase inner ......................................................................................................14
EXCEPTII ................................................................................................................................... 14
ITERATORUL ....................................................................................................................15
CONTAINERE....................................................................................................................16
LISTE ...............................................................................................................................16
.class
Extensia .class se refera la un fisier .class care rezulta in urma compilarii de catre Masina
Virtuala Java a fisierelor .java. Cand compilam un fisier .java primim la output cat un fisier
pentru fiecare clasa compilate din fisierul .java. Fiecare output va fi de forma ClassName.class
adica numele clasei si extensia .class. Fisierele .class contin bytecode adica cod binary executat
la rulare de Java Virtual Machine.
Un program Java contine mai multe fisiere .class care pot fi puse intr-un package sau
comprimate intr-un jar. In programul nostru clasele se incarca atunci cand cream un obiect de
tipul acelei clase; dupa crearea obiectului este identificat fisierul .class creat si sunt adusi in
memorie octetii pentru aceasta clasa.
Un fisier .class poate fi compliat prin linie de comanda introducand javac.
CLASSPATH
Variabilele classpath spun aplicatiilor, JDKurilor unde sa caute clasele deoarece acestea contin
calea root pentru directoare. Valoare default este punctul (.) ceea ce inseamna ca sunt cautate
clasele doar in directorul current, dar prin folosirea classpath-ului supreascriem valoarea default.
Pentru ca Masina Virtuala sa nu caute clasele compilate prin toate folderele, trebuie sa ii
specificam in ce foldere sa se uite, iar acest lucru il facem cu CLASSPATH. Maisna Virtuala
trebuie sa gaseasca orice clasa (cu extensia .class) compilata cu javac.
Classpath-ul il setam pe nu system windows de la setarile de environment.
Diferenta dintre compilarea in C si compilarea in Java.
C ia codul sursa introdus ca input si produce cod masina care poate fi executat. Codul masina
poate rula doar pe hardware compatibile si care au un sistem de operare compatibil.
Java ia codul sursa introdus ca input si nu produce cod masina, ci BYTE CODE. Byte codul nu
poate fi executat direct pe o masina si are nevoie de o Masina Virtuala (JVM). Byte codul poate
rula pe orice platforma care are fie un compilator de byte code fie o masina virtuala. Din acest
motiv Java, spre deosebire de C ofera portabilitate.
Obiect – in Java
Un program Java este compus dintr-o colectie de obiecte care isi spun unul altuia ce sa faca. In
Java orice element este un obiect si fiecare obiect are un spatiu de memorie si un tip.
In Java se realizeaza un schimb de informatii. Prin obiecte se trimit mesaje. Toate obiectele de
acelasi tip pot primi acleasi mesaj.
Obiectul poate fi privit ca si furnizor de servicii. Un obiect este format din stari (adica attribute)
si comportamente (adica metode) si o identitate (adica un tip). Obiectul este instant unei clase.
De fiecare data cand vrem sa intantiem o anumita clasa, cream un obiect din clasa respective cu
comanda new. La instant new, se aloca memorie in spatiu heap.
Fiecare obiect necesita resurse iar Java utilizeaza in mod explicit alocarea dinamica a resurselor.
Obiectele se manipuleaza prin referintele catre obiecte.
Distrugerea obiectelor este realizata automat de GarbageCollector care identifica momentul in
care un obiect nu mai este utilizat si ii dezaloca memoria. Doar GarbageCollector poate disturge
obiectele in Java. Compilatorul nu stie cand intervine GarbageCollector-ul.
Specificatori de access
1. Public . Daca intr-un package definim clase cu acest specificator de acces de tipul:
public class MyClass{} toti membrii, variabilele si metodele vor avea access la calsa
respectiva.
2. Private Daca intr-un package definim clase cu acest specificator de access de tipul:
private class MyClass{} , vor avea access la clasa doar membrii, variabilele si metodele
din interiorul acelei clase. Optiunea private ne permite sa schimbam membrii din interior
fara sa ne gandim ca o alta clasa poata fi afectata de asta. Daca avem un contructor privat,
nu putem sa cream un obiect din clasa A in clasa B. Trebuie sa cream o metoda care
creaza obiectul clasei A si sa o apelam in clasa B.
3. Package. Daca intr-un package definim clase cu acest specificator de tipul: package class
ClasaA{} vor avea acces la clasa doar mebrii, metodele si variabilele din package-ul
respecitv cu mentiunea ca si clasele care mostenesc ClasaA vor avea access la clasa A
4. Defaul. Daca intr-un package definim clase cu acest specificator de tipul: class
ClasaA{}, vor avea acces la clasa doar mebrii, metodele si variabilele din package-ul
respecitv.
Variabile
Variabile locale- sunt definite in interiorul metodelor, costructorilor sau blocurilor
Variabile de instanta- sunt variabile in cadrul unor clase dar inafara ,metodelor. Sunt initializate
cand e instantiata clasa.
Variabile de clasa- sunt variabile declarate intr-o clasa cu cuvantul cheie static
Constructor
O clasa contine constructori care ajuta la crearea obiectelor din acea clasa. Constructorul este
apelat cu oepratorul new. Prototipul pentru un constructor din clasa A este: public A(){}
Putem avea mai multi constructori intr-o clasa daca au numar diferit de argumente. La fel ca la
metode, Java diferentiaza constructorii in functie de tipul si numarul de argumente pe care il au.
Daca nu declaram niciun constructor intr-o clasa, compilatorul declara automat un constructor
default. Constructorul default este un constructor care nu are argumente si corpul construtorului
este gol.
Numele constructorului trebuie sa fie identic cu numele clasei. In plus constructorul nu are tip de
return.
Overloading (Supraincarcarea)
In Java ne referim la un obiect, clasa, atribut sau metoda prin numele acestora. Daca avem
metode cu acelasi nume, Java trebuie sa stie ce metoda sa acceseze in momentul apelarii. Din
acest motiv argumentele metodei trebuie sa fie diferite. Aceasta este supraincarcarea.
Supraincarcarea metodelor mareste lizibilitatea programului. Putem supraincarca metode prin
schimbarea numarului de argumente sau prin modificarea tipului de date. Putem supraincarca si
emtoda main, dar programuol o va accesa mereu pe cea cu parametrii: (String[] args) .
În Java un alt factor forțează supraicarcarea metodelor este constructorul.
Finalize()
Aceasta metoda permite operatii de stergere inainte ca obiectele sa fie supuse garbage
collectorului
GC stie doar cum sa elibereze memoria alocata cu new, deci nu va sti sa elibereze o memorie
speciala care nu este alocata cu new. Pentru asta putem utiliza Finalize(). Cand GC este gata sa
elibereze memoria pentru un anumit obiect, apeleaza finalize() si doar la urmatorul pas de
‘’colectare’’ va recupera memoria obiectului. Java nu garanteaza apelarea emtodei finalize().
Bloc static
Este folosit pentru initializarea statica intr-o clasa.
Codul din blocul static este executat o singură dată: prima dată când facem un obiect din
acea clasă sau prima dată când accesam un membru static din acea clasă (chiar dacă nu
facem niciodată un obiect din acea clasă).
Blocurile statice sunt executate înainte de constructori
Bloc non-static (nestatic)
Prin blocul non-static se permite definirea claselor interne anonime.
Reutilizarea claselor
Compozitie.
Prin compozitie plasam referinta unui obiect din clasa A intr-o clasa B.
Compozitia este o forma restransa de agregare in care doua entitati sunt dependente.
Este de tipul “part of”.
In compozitie ambele entitati depinde una de celalalta, deci obiectul compus nu poate
exista fara cealalta entitate. De exemplu: nu poate exista o carte fara file (compozitie),
dar poate exista o biblioteca fara carti (agregare).
Diferenta Compozitie-Agregare
Prin compozitie plasam referinta unui obiect din clasa A intr-o clasa B, iar prin
agregare plasam doar o variabila de tipul clasei A in clasa B
In compozitie ambele entitati depinde una de celalalta, iar la agregare entitatile nu
depind una de cealalta.
Mostenirea
Atunci cand o clasa (superclasa) dobandeste proprietatile unei alt clase (subclasa)
avem mostenire.
O subclasa mosteneste membrii (campuri, metode, clase imbricate) din superclasa.
Constructorii nu sunt membrii deci nu sunt mosteniti de subclase dar pot fi invocati (cu
super). Constructorul clasei de bază este apelat intotdeauna inaintea constructorului clasei
derivate
La crearea obiectului din clasa derivată, se crează un subobiect din clasa de bază (ca
si cum ar fi realizată o compozitie către acesta)
Mostenirea se realizează ori de câte ori se crează o clasă pentru că dacă nu moșteniți în
mod explicit din altă clasă, mosteniti implicit din Object.
Relația de substituție:
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 relație de tip is-like-a: partea extinsă din clasa derivată nu mai este
disponibilă prin upcast (prin adresarea clasei de bază)
DELEGAREA
Prin delegare plasam un obiect mebru in clasa pe care o construim(compozitie)
dar in acelasi timp xpunem toate metodele din obiectul membru in noua clasa.
FINAL
Cuvântul cheie final este folosit pentru a face o variabilă constantă. Atunci când o
variabilă este declarată cu cuvântul cheie final , valoarea sa nu poate fi
modificată. Acest lucru este util pentru constantele care au valori universale.
La primitive final face ca valoarea primitive sa fie constanta.
La referintele de obiect final face referinta constanta. O data ce o referinta este
initializata spre un obiect, aceasta nu va putea fi niciodata modificata pentru a indica
un alt obiect, dar obiectul insusi poate fi modificat.
Final este aplicabil doar unei variabile, unei metode sau unei clase.
Daca declaram o metoda final, metoda nu mai poate fi suprascrisa. Orice metoda
private (private) este implicit final. Metodele final sunt tratate inline de către compilator
Blank final
Un bank final in java este un camp final care nu este inițializat în timpul declarației.
Poate fi inițializat numai în cadrul unui constructor. Acesta generează eroare de
compilare dacă nu este inițializat, deoarece ar trebui să i se dea o valoare undeva în
program și asta numai de la un constructor.
Upcast
Folosim upcast pentru a converti de la un tip mai specific la un tip mai general.
Facem upcast cand luam o referinta a unui obiect si o tratam ca referinta a tipului de
baza.
BINDING
In Java exista doua tipuri de legare (binding). Early binding si late binding. Early
binding este atunci cand legarea se face la compilare si Late binding este atunci cand
legarea se face la executie (numita si legare dinamica sau run-time binding). Atunci
cand un limbaj implementeaza late binding trebuie sa existe un mecanism pentru a
determina tipul obiectului la momentul executarii pentru a apela metoda
corespunzatoare.
In Java se foloseste metoda late binding cu exceptia metodelor declarate static sau
final.
Daca declaram o metoda final se inhiba late bindingul si creste eficienta la executie
pentru ca legarea se face la compilare.
Clasele abstracte
Cream clase abstracte cand vrem sa manipulam un set de clase prin interfata lor comuna.
Clasele abstracte sunt un punct de mofloc intre clasele normale si interfetele si sunt necesare
pentru construirea de clase care au metode neimplementate.
O clasa abstracta are cel putin o metoda abstracta. Metodele abstracte sunt incomplete deoarece
au doar declaratia de metoda, fara corp. Din acest motiv nu se poate crea un obiect dintr-o clasa
abstracta (pentru ca nu are corp) Se generează eroare la compilare dacă se incearcă crearea unui
obiect dintr-o clasă abstractă.
Daca mostenim dintr-o clasa abstracta, metoda abstractă trebuie suprascrisă, altfel clasa derivată
devine si ea abstractă
Diferenta dintre interfata si clasa abstracta (interfata clasa abstracta)
Interfata nu poate oferi implementari de metode si putem implementa din mai multe interfete dar
nu putem mosteni din mai multe clase abstracte.
Metodele abstracte pot fi si package acces, nu neaparat public cum sunt interfetele.
Interfata
Interfata o implementam cu cuvantul cheie implements.
Interfetele ofera doar o forma, nu si o implementare. Interfetele produc clase complet abstracte,
fara implementare de metode.
Interfata permite mostenirea multipla: Putem implementa din mai multe interfete dar nu putem
mosteni dikn mai multe clase.
O interfata poate contine campuri dar sunt implicit static si final.
Polimorfism
Este a 3-a caracteristica importanta in Programarea orientate obiect, dupa abstractizare si mostenire si
se caracterizeaza prin separarea interfetei de punerea ei in aplicare. Metoda polimorfica permite unui
tip (adica unei clase) sa arate elementele ei diferite fata de un alt tip (clasa) similar atata timp cat
ambele tipuri sunt derivate din acelasi tip de baza.
Polimorfismul arata prin ce se deosebeste o Clasa A de o clasa B tinand cont ca ambele mostenesc din
Clasa C, adica prin diferentele de comportament ale metodelor.
Dispose()
Metoda este folosita pentru clean-up
Acest tip de model de design intră sub model structural deoarece acest model combină capacitatea a
două interfețe independente.
Mostenirea multipla
Interfetele pot face upcast la mai mult decat o singura clasa de baza. La interfete putem adauga noi
declaratii de metode utilizand mostenirea
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
Print interfete putem face upcast la mai mult decat o clasa de baza
Campurile care sunt inserate intr-o interfata devin in mod automat static si final. Nu putem declara
campuri blank final in interfata.
La Design pattern Factory Method in loc sa apelam un constructor in mod direct, putem apela o metoda
de creare a unui obiect din Factory, care produce o implementare a interfetei.
Factory Method oferă una dintre cele mai bune modalități de a crea un obiect.
Clase inner
Clasele interioare sunt clase definite in interiorul altor clase. De obicei clasele exterioare au o
metoda care returneaza o referinta la clasele interioare.
Obiectul clasei interioare are o referinta catre obiectul clasei exterioare
Tipul obiectului din clasa interioara se specifica prin NumeleClaseiExterioare.NumeleClaseiIterioare
Daca vrem sa obtinem referinta la obiectul clasei exterioare (din obiectul clasei inner) folosim:
OuterType.this
Daca vrem sa cream un obiect din clasa inner pornind de la un obiect din clasaouter folosim:
obiectOuter.new
Clasa interioara poate fi accesata doar din interiorul metodei(sau a doemniului de vizibilitate) in care a
fost definita.
Clasele interioare pot fi create intr-o metoda sau domeniu de vizibilitate deoarece:
Se implementeaza o interfata, deci se poate crea si returna o referinta la aceasta
(upcast)
De ce inner class?
Fără capacitatea oferită de clasele interioare de a moșteni - din mai
multe clase concrete sau abstracte , unele probleme de proiectare și programare ar fi
imposibil de rezolvat.
Putem privi clasa interioară este ca si o solutie pentru moștenirea multipla. Clasele
interioare permit "moștenirea mai multor implementări".Clasele interioare permit în
mod efectiv să moștenim din mai multe interfețe .
Daca avem clase abstracte sau concrete în loc de interfețe, suntem limitati sa folosim
clase inner.
1. Clasa interioară poate avea mai multe instanțe, iar acestea sunt independente de
clasa exterioara.
2. Într-o singură clasă exterioară putem avea mai multe clase interioare, fiecare
implementând aceeași interfață sau moștenind din aceeași clasă într-un mod
diferit.
3. Nu exista relatie de tip is-a
Clasele locale sunt declarații de clasă, dar clasele anonime sunt expresii, ceea ce înseamnă că definim clasa
într-o altă expresie. Sintaxa unei expresii de clasă anonimă este ca invocarea unui constructor, cu excepția
faptului că există o definiție de clasă conținută într-un bloc de cod.
Clasele anonime nu pot avea constructor, dar initializarile se pot realiza in blocul non-static de initializare
Closure
Este un obiect apelabil care pastreaza informatii despre domeniul de vizibilitate in care s-a creat.
Clasele inner sunt closure pentru ca au o referinta catre obiectul din clasa exterioara si poate accesa
chiar si membrii private ai clasei.
Callback
Un obiect primeste o informatie care va permite sa apelam obiectul initial la un moment ulterior de timp
De ce callbacks? La executie, se poate schimba metoda care este apelată, in mod dinamic
Callback se implementeaza cu clase interioare
EXCEPTII
Erorile ar trebui prinse la compilare, inainte de a incerca sa rulam programul.
Avantajul execptiilor este ca nu mai avem nevoie sa verificam eroarea particulara in mai multe locuri din
program; nu mai e nevoie sa verificam atunci cand apelam metoda din moment ce exceptiile garanteaza
ca cineva le va prinde. Astfel trebuie sa rezolvam eroarea doar intr-un singur loc. Asta inseamna ca si
codul devine mult mai usor de scris si de citit.
Problemele care nu pot fi rpinse la compilare trebuie rezolvate la executie printr-un mecanism prin care
clientul sa fie constient de rezolvarea situatiei.
Cand gasim o eroare pe care nu stim sa o tratam, insa stim ca nu putem continua cu ea, o transmitem la
un mediu de vizibilitate exterior.
Cand apare o eroare, cream un obiect de tip exceptie, firul de executie se intrerupe si referinta e trimisa
la mediu de vizibilitate extern, se incearca reluarea executiei programului, iar handlerul de exceptie
recupereaza programul de la eroarea aparuta.
Aruncam o exceptie prin throw (exemplu: throw new NullPointerException();)
Daca extindem clasa Throwable, putem arunca orice tip de obiect din throwable cu throw.
Logging
Cand se suprascrie o metoda, se pot arunca doar exceptiile de tipul specificat in metoda din
clasa de baza
Constructorii trebuie sa isi incheie cu success executia pentru a aduce obiectele intr-o stare
sigura
Exception matching: se face potrivire pe cea mai apropiata clauza catch care potriveste cu tipul
exceptiei
La rezolvare, de obicei se rezolva problema exceptiei si se reia executia codului care a generat
exceptia sau se transmite executia la un nivel superior fara reluarea codului
ITERATORUL
La colectii, iteratorul permite regasirea ordonata a obiectelor din colectia respectiva
Cu metoda hasNext() interogheaza daca mai sunt elemente neiterate. Metoda e de tip Boolean
Spre deosebire de ListIterator, Iteratorii pot produce elementele colectiei doar intr-o singura directie.
ListIteratorul poate parcurge elementele colectiei in ambele directii.
CONTAINERE
LISTE
ArrayList: lista implementata cu un sir. Permite operatii rapide pentru access random la
elemente. Operatiile de inserare si stergere de la mijlocul listei sunt costisitoare
LinkedList: lista implementata cu lista simplu inlantuita. Permite operatii rapide de insertie si
stergere de la mijlocul listei, insa operatiile de regasirea aleatoare sunt costisitoare