Sunteți pe pagina 1din 27

Limbaje de programare curs 2 - Informatic Economic, an III

Notiuni introductive Java


Initializarea obiectelor

Gheorghe Cosmin Silaghi

Cluj-Napoca - 6 Octombrie 2014

Obiective
Deprinderea principalelor concepte ale limbajelor de programare
nvarea modului de aprofundare a unui limbaj
nvarea conceptelor paradigmei obiectuale
Deprinderea de aptitudini pe programare n Java si .NET

Organizare
Laborator: 418/419
Echipa: Conf. Dr. Mircea Moca, Asist. Drd. Alexandru Butoi

Cluj-Napoca - 6 Octombrie 2014

Limbaje de programare
Cerine, evaluare
Prob teoretic: 50% - din care

Examen scris n Noiembrie: 75%


2 teste scrise la finalul cursurilor: fiecare 12.5%
Testele scrise: materia predata pana la momentul testului

Prob practic: 50%, din care

Proba practic: examen pe bilete, n 16 Noiembrie 30%


Evaluarea activitii de laborator: 70%

Necesar: minim 5 la fiecare prob de examen

Cluj-Napoca - 6 Octombrie 2014

Bibliografie
Bruce Eckel, Thinking in Java, 4th edition, Prentice Hall 2006
(handouts la fiecare curs)

Orice al material la dispozitia dvs este potrivit

Cluj-Napoca - 6 Octombrie 2014

Organizarea codului
Pentru fiecare clasa compilata se produce un fisier .class
Un program este compus dintr-o colectie de fisiere .class
Acestea pot fi arhivate: fisier .jar
Fiecare fisier .java incepe cu mentiunea package: se indica numele
packageului din care vor face parte clasele
Clasele utilizate care fac parte din alt package se importa cu import
Toate clasele dintr-un package vor fi colectate intr-un singur
subdirector
Conventie pentru denumirea packageurilor: utilizarea domeniilor de
internet in ordine inversa
Calea root pentru directorare: variabila sistem CLASSPATH
CLASSPATH poate include directoare sau fisiere .jar

Cluj-Napoca - 6 Octombrie 2014

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

Cluj-Napoca - 6 Octombrie 2014

Numele de obiecte - referinte


Identificatorii prin care se manipuleaza obiectele sunt referinte catre obiecte
De ex:
String s; // se creaza o referinta catre un obiect de tip String
String s = new String(asdf); // referinta creata este initializata
Toate variabilele (referintele) create in program trebuie initializate!!!

Cluj-Napoca - 6 Octombrie 2014

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 non-RAM: obiecte care exista in afara spatiului de
memorie a programului (persistenta obiectelor)

Tipurile primitive
Variabile de dimensiune mica, salvate direct pe stiva,
Nu necesita new la alocare
boolean, char, byte, short, int, long, float, double si void
Fiecare din acestea are un wrapper type pentru construirea obiectului
din tipul corespondent

Autoboxing: conversie automata de la un tip primitiv la wrapper


Character ch = x;

Cluj-Napoca - 6 Octombrie 2014

Numere de inalta precizie


BigInteger si BigDecimal
Sunt vazute ca si clase de tip Wrapper insa nu au un tip primitiv
corespondent

Siruri (Arrays) in Java


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 array-ului (se
arunca o exceptie)

Cluj-Napoca - 6 Octombrie 2014

Domenii de vizibilitate in Java


Intre o acolada deschisa si una inchisa avem un domeniu de
vizibilitate (la fel ca in C/C++)
Java determina cand un obiect nu mai este referit de catre
nici o referinta dintr-un domeniul de vizibilitate valid => se
apeleaza garbage collector pentru dezalocarea memoriei

Cluj-Napoca - 6 Octombrie 2014

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*/
}
Cluj-Napoca - 6 Octombrie 2014

Vizibilitatea numelor
Pentru a produce nume de biblioteci unice, s-a realizat conventia ca
fiecare programator sa isi utilizeze propriul nume de domeniu de
internet ca si nume de biblioteca
ex: ro.ubbcluj.econ.gsilaghi
Punctul in numele bibliotecii reprezinta un subdirector de pe disc
Utilizarea altor componente: import
import java.util.ArrayList; // se importa o clasa
import java.util.*; // se importa tot packageul java.util

Cluj-Napoca - 6 Octombrie 2014

Cuvantul cheie static


Datele membre si metodele pot fi accesate doar sub calificarea
unui obiect existent in memoria programului (creat cu new)
Un camp sau o metoda statica nu este legata de vreun obiect
anume dintr-o clasa

class data sau class method


Un camp static exista o singura data pentru o clasa, fiind
partajat de toate obiectele clasei respective
Campurile statice pot fi referite prin numele clasei
Metodele statice sunt la nivel de clasa, pot fi referite prin
numele clasei (fara a fi necesara existenta unui obiect)
Metoda main
Metodele statice nu pot accesa campuri/metode ne-statice din
clasa
Cluj-Napoca - 6 Octombrie 2014

Stil de scriere a codului


Code conventions for the Java Language
Numele clasei din mai multe cuvinte cu capitalizarea fiecarui
cuvant din nume
Pentru orice altceva (metode, campuri, referinte de obiecte)
prima litera e litera mica

Cluj-Napoca - 6 Octombrie 2014

Operatori
Toti operatorii produc o valoare prin aplicarea lor
Ei pot produce si side-effects (modificarea valorii operanzilor)
Operatorul de atribuire =

a= 4; // atribuirea unei valori dintr-un tip primiti unei variabile


Daca c si d sunt obiecte, c=d; // ambele (c si d) vor referi acelasi obiect (d)

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 (similar cu C/C++)
Operatorii == si =! Aplicati pe referinte de obiecte, compara referintele, si
nu continutul obiectelor
Pentru compararea continutului obiectelor, metoda equals:

n1.equals(n2);

Pentru clasa String se pot folosi + si +=

Cluj-Napoca - 6 Octombrie 2014

Controlul executiei
if-then-else
while, do-while, for
foreach: pentru a selecta un element dintr-un array si a efectua o
prelucrare pe acel element

foreach functioneaza pentru orice sir de obiecte Iterable

Intreruperea executiei unei secvente: return, break, continue


switch: instructiunea de selectie din mai multe alternative

Cluj-Napoca - 6 Octombrie 2014

Initializarea obiectelor
In fiecare clasa se garanteaza initializarea obiectelor prin
scrierea unui constructor
La crearea unui obiect, Java apeleaza automat constructorul
clasei respective
Numele constructorului este identic cu numele clasei
Constructorul default: nu are argumente
Constructorul nu are tip de return
Daca se creaza o clasa fr nici un constructor, compilatorul
creaz in mod automat constructorul default

Cluj-Napoca - 6 Octombrie 2014

Supraincarcarea metodelor
Utilizarea aceluiasi nume de metoda pentru mai multe metode cu
argumente diferite
Cum diferentiaza Java intre metodele supraincarcate: aceste metode
trebuie s difere prin lista argumentelor
La supraincarcare, primitivele din lista de argumente sunt
promoted catre tipurile mai largi
Metodele nu se pot supraincarca pe tipul de return

Cluj-Napoca - 6 Octombrie 2014

Cuvantul cheie this


In fiecare metoda apelata, referinta obiectului sub care se apeleaza
metoda este transmisa in metoda sub forma referintei this
this poate fi utilizat doar in interiorul metodelor ne-statice
In interiorul unei metode dinstr-o clasa, la apelul unei metode din clasa
curenta, nu este nevoie sa se utilizeze this
This este frecvent utilizat in return, pentru a returna obiectul curent

Cluj-Napoca - 6 Octombrie 2014

Distrugerea obiectelor
Garbage collector-ul dezaloca memoria alocata prin new, atunci cand
obiectele nu mai sunt folosite
Metoda finalize(): permite operatii de stergere inainte ca obiectele sa fie
supuse garbage collectorului
Metoda finalize(): Java nu garanteaza apelarea acestei metode,
programatorul nu are control asupra momentului cand se apeleaza
garbage collectorul
Daca obiectele noastre agrega alte obiecte, garbage collectorul se ocupa
de dezalocarea obiectelor agregate
Finalize se utilizeaza in general pentru a implementa termination
conditions pentru un obiect (de exemplu inchiderea unui fisier)

Cluj-Napoca - 6 Octombrie 2014

Modul de functionare a garbage collectorului


GC colecteaza memoria ramasa alocata in obiectele care nu mai sunt
utilizate si compacteaza heap-ul, rearanjand obiectele alocate
Reference couting: o modalitate de a implementa un GC:

De cate ori se asociaza o referinta pentru un obiect, reference counterul obiectului se


incrementeaza
De cate ori se pierde o referinta pentru o obiect, reference counterul obiectului se
decrementeaza
GC scaneaza sirul de variabile reference counters si cand intalneste una nula, dezaloca
obiectul respectiv

Implementarea Java: pentru un obiect live se poate identifica o


referinta fie pe stack fie in static storage
Stop-and-copy: 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

Cluj-Napoca - 6 Octombrie 2014

Initializarea datelor membre


Utilizarea unei variabile locale neinitializate => eroare de compilare
Orice data membra a unei clase, daca este de tip primitiv, se
garanteaza initializare la valoarea implicita
Obiectele membre neinitializate, vor avea valoarea null
Specificarea valorii de initializare:

La momentul definirii variabilei primitive prin asignare cu o valoare


La momentul definirii variabilei non-primitive, prin new

Initializarea datelor membre prin constructor


Ordinea de initializare a datelor membre: ordinea in care acestea sunt
definite in clasa
Initializarea datelor statice are loc doar daca acestea sunt necesar a fi
utilizate
Obiectele statice sunt initializate inaintea celor non-statice, daca ele nu
au fost utilizate pana atunci

Cluj-Napoca - 6 Octombrie 2014

Procesul creerii unui obiect


Presupunem ca avem o clasa Dog
Prima data cand un obiect de tip Dog este creat, JVM localizeaza pe disc
fisierul Dog.class si il incarca
La incarcarea Dog.class, se initializeaza toti membrii statici
La new Dog() se aloca memorie pe heap pentru noul obiect, aceasta zona
de memorie se umple cu 0 (primitivele sunt initializate la valoarea implicita)
Se realizeaza toate initializarile explicite la momentul definirii datelor
membre
Se executa constructorul

Cluj-Napoca - 6 Octombrie 2014

Blocul static
static {/* initializari */};
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
Blocul static poate sa initializeze doar date statice

Initializare prin bloc non-static


{ /* operatii */ }; // fara static inainte
Intre acolade se specifica operatii de initializare care trebuie efectuate
indiferent de care constructor este apelat
Blocul non-static de initializare este necesar pentru a se permite
definirea claselor interne anonime

Cluj-Napoca - 6 Octombrie 2014

Initializarea sirurilor
Sirurile sunt definite prin operatorul de indexare: int[] a;
Pentru a se crea spatiu de memorie pentru sir, sirul trebuie initializat
Fiecare sir are un membru intrinsec: length (lungimea sirului)
Elementele sunt indexate de la 0 la length-1

Integer[] a = new Integer[rand.nextInt(20)]; // se creaza doar un sir


de referinte, fiecare din ele trebuie apoi initializate, de ex:
a[i] = rand.nextInt(500);

Cluj-Napoca - 6 Octombrie 2014

Controlul accesului - clase


Package: clase grupate impreuna intr-un singur spatiu de nume logic
Orice clas dintr-un package poate face referire direct la o alta clas
din acelai package
Pentru accesarea claselor din alte package-uri se utilizeaz import
Lipsa definitiei de package: package-ul default.

Nu se recomand utilizarea acestuia

Specificatorul de access public la clase:

Pentru a putea fi referita din afara packageului

Clasele fr specificator de access: nu pot fi referite din afara packageului

Cluj-Napoca - 6 Octombrie 2014

Controlul accesului membrii claselor


Public:

membrii publici pot fi referiti din afara claselor


Specific interfaa claselor

Private:

Pot fi referiti doar din interiorul claselor de definire


Specifica implementarea claselor

Fr specificator de access access package:

Pot fi referii din clasele packege-ului curent

Protected: folosit in contextul mosternirii

Cluj-Napoca - 6 Octombrie 2014

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