Sunteți pe pagina 1din 116

Curs pentru

MAI, SDI anul II


semestrul II
Lect. univ. dr. Horea Oros
Email: horea.oros@gmail.com
Universitatea din Oradea, Departamentul de Matematic i Informatic

TEHNOLOGII I PLATFORME
JAVA PENTRU APLICAII
DISTRIBUITE
Limbajul de programare Java

Prefa
Introducere
Obiecte totul e obiect
Operatori
Controlul execuiei
Iniializare
Controlul accesului
Reutilizarea claselor
Polimorfism
Interfee
Limbajul de programare Java

Clase interne
Agregarea obiectelor
Tratarea erorilor cu excepii
iruri de caractere
Informaii despre tip
Generics
Tablouri
Containeri
I/O
Tipuri enumerate
Abstractizare

Programare = gestionarea complexitii


Complexitatea problemei
Complexitatea mainii
Java = proiectat pentru a gestiona
complexitatea problemelor
Timpul de proiectare/implementare a
problemelor se reduce semnificativ
Java nu las deoparte: multithreading, reea,
cross-platforma, schimbare dinamic a
codului, securitate
Java

Java = a avut probleme de performan


Ne poate face programatori mult mai
productivi
Java SE5,6,7
Medii de programare
Netbeans
Eclipse
Totul e un Obiect

Toate limbajele de programare ofer un


anumit nivel de abstractizare
Programatorul trebuie s stabileasc o
asociere ntre modelul mainii (spaiul
soluiei) i modelul problemei (spaiul
problemei)
POO permite exprimarea soluiei problemei
n termenii problemei i nu ai mainii
Obiect = caracteristici + comportamente
Obiect n programare = stare + operaii
Obiecte

Obiectul are stare, comportament i identitate


Caracteristici pentru POO
1. Totul e un obiect
2. Un program e o colecie de obiecte care i
trimit mesaje unul altuia
3. Fiecare obiect are propria memorie format din
alte obiecte
4. Fiecare obiect are un tip (este o instan a unei
clase)
5. Toate obiectele de un anumit tip pot primi
aceleai mesaje
Clase

Ce este o clas?
Ce este un obiect?
Crearea de tipuri abstracte de date = concept
fundamental n POO
Un obiect este o instan/realizare a unei
clase
Clasa definete starea i comportamentul
obiectelor
n POO crem noi tipuri de date (clase)
Obiecte

Orice obiect are o interfa =


mesajele/cererile pe care le poate primi

Light lt = new Light()


lt.on() Nume tip Light
Interfaa On()
Off()
Brighten()
Dim()
ncapsulare

Implementare = datele ascunse + codul care


realizeaz cererile/mesajele
Creatori de clase consumatori de clase
Creatorul de clase va expune interfaa i va
pstra implementarea ascuns
Implementarea ascuns permite modificri
Pstrarea limitelor se realizeaz prin controlul
accesului (public, private, protected, implicit =
package)
ncapsulare

Reutilizarea codului = unul din marile


avantaje ale POO
Un obiect poate conine alte obiecte =
compoziie/agregare relaia are-un
O main are un motor
Un cont bancar are un titular, balan etc.

Car Engine
Motenire

Motenire, clas de baz, clas derivat


Relaii ntre clase de tip este un/o
Dou tipuri pot avea caracteristici i
funcionalitate comun
Clasa derivat poate avea mai Base

mult funcionalitate sau


funcionalitate modificat
Exemplu: forme geometrice Derived
Polimorfism prin funcii
virtuale
Polimorfism
Early binding late binding
n Java implicit avem late binding
Alte limbaje folosesc calificatorul virtual
Upcasting
Shape

Circle Square Triangle


Ierarhia cu o singur
rdcin
n limbajele OO de regul avem ierarhii de
clase cu o singur rdcin
La primul nivel este clasa Object
Excepie face C++
O singur rdcin
interfa comun
O anumit funcionalitate garantat
Transmiterea parametrilor simplificat
Garbage collector simplu de implementat
Containere

De regul nu tim cu cte obiecte vom lucra


Soluia cu tablouri nu este prea bun
Containere/colecii ne ajut s stocm cte
obiecte avem nevoie
C++ are STL
Java are o serie de containere n biblioteca
standard
List (ArrayList, LinkedList), Map (tablouri
asociative), Set etc. (cozi, stive, arbori)
Tipuri parametrizate
(generics)
nainte de Java SE5 containerele conineau ca tip de
baz Object
ntr-un container se putea pune orice (inclusiv tipuri
primitive datorit autoboxing)
Conversia n Object duce la pierderea informaiei de
tip (se face upcasting)
Obinerea datelor se face prin downcasting, ceea ce
nu este ntotdeauna sigur (Downcast nspre tipul
greit genereaz excepie)
Generics elimin necesitatea downcast-ului care e
o operaie costisitoare la execuie
ArrayList<Shape> shapes = new ArrayList<Shape> ()
Crearea obiectelor i
perioada de via
Obiecte create static pe stiv
Obiecte create dinamic n heap
Cnd este eliberat memoria?
Garbage collector
n Java e mai simplu de gestionat memoria
dect n C++
Perioada de via determinat de
compilator pentru obiecte create pe stiv
Tratarea erorilor cu
excepii
n general schemele de tratarea a erorilor se
bazeaz pe vigilena programatorului i nu pe
convenii stabilite de limbajul de programare
Tratarea excepiilor introduce partea de
tratare a erorilor direct n limbaj
Logica aplicaiei este separat de partea de
tratare a erorilor
Erorile sunt lansate i prinse n blocul de
tratare
Programare concurent

Rezolvarea mai multor sarcini n acelai timp


Fire de execuie
Conceptul general = concuren
Cu mai multe procesoare se poate realiza
concuren real
Problema = resurse partajate
Java are suport n limbaj pentru concuren
Totul este un obiect

Java bazat pe C++


Java este un limbaj POO mai pur
Java, C++ limbaje hibride, dar n Java nu e
foarte important la fel ca i n C++
n Java pp. c vrem s facem doar POO
C++ trebuia s fie compatibil cu C
n Java aproape totul este un obiect
Gestionarea obiectelor prin
referine
Elementele din memorie se gestioneaz n
diverse moduri: variabile, pointeri, obiecte,
referine la obiecte
n Java ne referim ntr-un singur mod: totul
tratm ca fiind un obiect
Referina = identificatorul prin care ne referim
la obiect
Exemplu: TV-telecomand (schimb canal,
micoreaz volumul)
Gestionarea obiectelor prin
referine
O referin poate s existe fr un obiect
referit
String s;
ncercarea de a trimite un mesaj prin s va
genera eroare
E indicat s iniializm ntotdeauna
String s = Hello Java;
Totul este un obiect

Toate obiectele trebuie create


String s = new String(Hello Java);
Operatorul new creaz un obiect i ntoarce o
referin
Java are multe tipuri predefinite
Putem crea tipuri de date aspect
fundamental n POO i Java
Totul este un obiect

Unde se stocheaz datele? Cum este


organizat memoria?
Registre n procesor. Nu avem control asupra lor
Stiv n RAM cu suport direct din partea
procesorului prin pointerul de stiv. Foarte eficient
i rapid mod pentru alocare de memorie. Perioada
de via a elementelor din stiv este predefinit
ceea ce este o constrngere ce limiteaz
flexibilitatea stivei. Referinele la obiecte se
stocheaz aici.
Totul este un obiect

Unde se stocheaz datele? Cum este


organizat memoria?
Heap memorie pentru uz general n RAM. Aici
sunt create obiectele. Compilatorul nu trebuie s
tie ct vor tri obiectele flexibilitate.
Operatorul new aloc obiectele n heap.
Compromisul este timpul de execuie mai lent
alocare/eliberare
Stocare valori constante direct n codul
programului
Totul este un obiect

Unde se stocheaz datele? Cum este


organizat memoria?
Stocare n afara RAM obiecte sub form de
stream-uri de octei (trimise la alt proces) i
obiecte persistente (plasate pe disc sub form de
fiiere) . Obiectele trebuie s poat fi recuperate i
ncrcate n RAM
Tipurile primitive
Tipurile primitive pentru ele se creeaz o
variabil automatic (nu o referin) pentru
c e mult mai eficient. Este plasat n stiv.
Tip Dim bii Min Max Wrapper
boolean - - - Boolean
char 16 Unicode 0 Unicode 216-1 Char
byte 8 -128 +127 Byte
short 16 -215 +215-1 Short
int 32 -231 +231-1 Int
long 64 -263 +263-1 Long
float 32 IEEE754 IEEE754 Float
double 64 IEEE754 IEEE754 Double
void - - - Void
Totul este un obiect

Toate tipurile numerice sunt cu semn


Valorile pentru boolean = true i false
Clasele wrapper au rolul de a transforma un
tip primitiv ntr-un obiect pe heap
char c = x;
Character ch = new Character(c);
Autoboxing
Character ch = x;
char c = ch;
Totul este un obiect

Pentru calcule cu numere foarte mari i


precizie foarte bun
BigInteger numere ntregi
BigDecimal numere n virgul fix (calcule
monetare)
Aceste tipuri nu au corespondent cu tipurile
primitive
Operaiile vor fi mult mai lente (compromis
vitez-acuratee)
Tablouri

Tablouri exist n Java


Ele pot fi folosite n siguran
Sunt iniializate implicit
E interzis s folosim indeci n afara limitelor
tabloului mediul de execuie va raporta excepie
Costul este performana
Un tablou de referine va fi iniializat cu null.
Erorile tipice la utilizarea tablourile sunt
prevenite n Java
Distrugerea obiectelor

Obiectele nu trebuie distruse niciodat


n limbajele procedurale exist conceptul de scop
definit de { }
{
int x = 12;
// doar x este disponibil
{
int q = 96;
// x i q sunt disponibile
}
// doar x este disponibil
}
Totul este un obiect

Obiectele Java nu mor cnd se termin


blocul n care au fost create cu new
{
String s = new String(Hello Java);
}
Referina s dispare dar obiectul ocup n
continuare memorie
Aici nu vom mai putea accesa obiectul pentru
c nu mai avem o referin la el dup
terminarea blocului
Totul este un obiect

n C++ obiectele trebuie distruse cu


operatorul delete cnd nu mai avem nevoie
de ele.
n Java nu trebuie s ne preocupe acest
aspect
Multe probleme de programare dispar n
acest fel
Obiectele vor fi eliberate de garbage collector
Este eliminat problema generat de
memory leaks
Clase

Crearea de noi tipuri de date: clase


Clasa determin cum arat obiectul
Cuvntul cheie pentru crearea de noi clase
este class.
class NumeTip {/*corpul clasei*/}
Crearea unei instane a clasei/un obiect
NumeTip a = new NumeTip();
Clase

O clas conine
Cmpuri (membri dat) obiect de orice tip la
care ne referim prin referin sau un tip primitiv
Metode (funcii membre)
class DoarDate
{
int i;
double d;
boolean b;
}
DoarDate date = new DoarDate();
Date membre

Pentru a ne referi la datele membre ale unei


clase folosim sintaxa:
ReferinObiect.membru
Exemplu
date.i;
date.d;
date.b;
Obiectul poate conine alte obiecte pentru
care vrem s modificm datele
avion.rezervorStang.capacitate = 100;
Valori implicite

Valori implicite pentru tipurile fundamentale


folosite ca membri ai claselor. Nu se aplic la
variabilele locale.
boolean = false
char =\u0000 (null)
byte = (byte)0
short = (short)0
int = 0
long = 0L
float = 0.0f
double = 0.0d
Metode

Funcie = subrutin cu nume


Metod = o modalitate de a face ceva.
Termen POO
Metodele determin mesajele pe care le pot
primi obiectele.
Elementele unei metode
Nume
Argumente
Tipul de return
Corpul
Metode

TipReturn numeMetod(/*list argumente*/)


{
/* corpul metodei */
}
Numele metodei + lista de argumente =
semntura metodei
Semntura identific n mod unic o metod
Metodele trebuie s fie membre ale claselor
O metod poate fi apelat doar pentru un obiect
(excepie metodele statice)
Metode

Sintaxa pentru apelul metodelor


numeObiect.NumeMetod(arg1, arg2, arg3);
int x = a.f();
Mesajul f este trimis obiectului a
POO = trimiterea de mesaje unor obiecte
Lista de argumente stabilete informaia
transmis metodei argumentele vor fi obiecte
Ceea ce se transmite de fapt sunt referine la
obiecte
Metode

int Stocare(String s)
{
return s.length()*2;
}
Funcia calculeaz numrul de octei necesari
pentru stocarea irului de caractere
Funciile pot avea tipul de return void
n funcii void instruciunea return poate
apare fr nici o valoare
Crearea unui program Java

Vizibilitatea numelor
Cum se evit ambiguitile de nume?
n C e de negestionat
n C++ exist clase dar sunt permise i nume
globale. S-a introdus namespace
n Java folosim numele domeniului de
Internet n ordine invers pentru a produce
nume neambigue pentru o bibliotec.
Crearea unui program Java

Nume pentru bibliotec


ro.uoradea.mai
Fiierele vor face parte automat dintr-un
namespace
Fiecare clas va avea un identificator unic
ntr-un fiier
Limbajul va garanta conflictele de nume
Utilizarea altor componente

O clas poate exista n acelai fiier n care se


folosete o utilizm direct (nu avem
problema cu referinele nainte)
O clas poate fi ntr-un alt fiier folosim
cuvntul cheie import pentru a specifica
pachetul pe care vrem s-l folosim
Componente din biblioteca standard Java
import java.util.ArrayList // importm o clas
import java.util.* // importm toate clasele din util
Cuvntul static

Clasa descrie modul n care arat un obiect i


modul n care se comport
Obiectul este creat cu new
Dac vrem s avem o singur valoarea pentru
toate obiectele/ valoarea la nivel de clas
folosim calificm membrul cu static
De asemenea o funcie static poate fi apelat
fr s existe un obiect
Un membru static nu este legat de o instan
a clasei
Cuvntul static

Membri statici sunt membri la nivel de clas


Membri non-statici sunt membri la nivel de
obiect
Metodele statice nu pot accesa membri non-
statici
class StaticTest StaticTest st1 = new StaticTest();
StaticTest st2 = new StaticTest();
{ //st1.i i st2.i refer aceeai valoare
static int i = 41; //ne putem referi si cu StaticTest.i
} //aceeai logic i pentru metode
Hello, Java
//HelloDate.java
//numele fiierului este acelai cu
//numele clasei ce conine funcia main
import java.util.*;
// java.lang este importat automat
public class HelloDate{
public static void main(String[] args){
System.out.println(Hello, este);
System.out.println(new Date());
// clasa System este n pachetul java.lang
}
}
ShowProperties

public class ShowProperties{


public static void main(String[] args)
{
System.getProperties().list(System.out);
System.out.println(
System.getProperty(user.name));
System.out.println(
System.getProperty(java.library.path));
}
}
Comentarii

/* Comentariu
* pe mai
* multe linii
*/
Sau
/* Comentariu
pe mai multe linii */
//comentariu pe o singur linie
Documentaie comentariu
Operatori

La nivelul cel mai de jos datele sunt


manipulate cu ajutorul operatorilor
Toi operatorii produc o valoare din operanzi
Unii operatori modific valoarea operanzilor
efect secundar
Precedena operatorilor definete modul n
care sunt evaluate expresiile
Operatorul + poate fi folosit cu String poate
face ce conversii la String (abc + 123)
Operatori
Atribuire: =
R-valori constante, variabile, expresii
L-valori variabil cu nume (trebuie s existe
un spaiu fizic pentru stocarea valorii)
Pentru tipurile primitive se copiaz valori
Pentru obiecte se copiaz referinele
Exemplu: Operators/Assignment.java
Aliasing = avem dou referine care indic
acelai obiect fenomenul apare i la apeluri
de metode operators/PassObject.java
Operatori matematici

Aditivi: +, -
Multiplicativi: *, /, %
Atribuire compus: +=, -= etc.
Pentru a genera numere aleatoare folosim
clasa Random
Random rnd = new Random();
int n = rnd.nextInt(100);
nextInt(), nextFloat(), nextLong(),
nextDouble()
Operatori

+, - unar
++, -- incrementare, decrementare (pre i
post)
Exemplu: operators/AutoInc.java
Operatorul de atribuire i operatorii de
incrementare/decrementare sunt singurii care
au efecte secundare
Java = C++-- (Bill Joy unul din creatorii
Java)
Operatori

Operatorii relaionali genereaz un rezultat


de tip boolean (true/false)
>, <, >=, <=, ==, !=
Operatorii == i != cnd sunt aplicai asupra
unor referine vor determina dac este referit
acelai obiect sau nu. Nu se va determina
dac obiectele conin aceleai date/valori
Dac vrem s comparm datele a dou
obiecte trebuie suprascris funcia equals()
Operatori

Operatorii logici
AND - &&
OR - ||
NOT - !
Pot fi aplicai doar asupra unor valori de tip
boolean spre deosebire de C, C++
Atenie la compararea valorilor de tip
float/double
Evaluare prin scurt-circuit
A && B dac A este fals B nu se mai evalueaz
A || B dac A este true B nu se mai evalueaz
Operatori - literali

Pentru a evita anumite ambiguiti


0x2f hexazecimal cu liter mic
0X2F hexazecimal cu liter mare
0177 octal
0xffff cea mai mare valoare pentru char n hexa
0x7f cea mai mare valoare pentru byte
0x7fff cea mai mare valoare pentru short
long n = 200L; // sufixul pentru long
float f = 1F; // sufixul pentru float
double d = 1D; // sufixul pentru double
Operatori - literali

Exponeniere
float exp = 1.39e-43f
e nseamn zece la puterea
Notaia e a fost introdus n FORTRAN i s-a
pstrat n C, C++, Java etc.
Caracterul de la sfritul literalului nu trebuie
adugat dac se poate determina tipul.
long n = 200; // nu e nici o ambiguitate
float f 2= 1e-43f; // fr f literalul este tratat ca
fiind double
Operatori pe bii

Permit manipularea biilor individuali dintr-un


numr ntreg.
Provin din limbajul C partea low level unde
hardware-ul este gestionat n mod direct i
trebuie setate registre
Operatori:
AND &
OR |
XOR ^
Operatori pe bii

Operatori pe bii:
NOT ~ (operatorul complement fa de unu)
AND, OR i XOR pot fi aplicai asupra valorilor
de tip boolean. Nu apare scurtcircuit.
NOT (~)nu poate fi aplicat asupra valorilor de
tip boolean
Deplasare pe bii (pot fi folosii doar cu tipuri
ntregi primitive operanzii char, byte, short
sunt transformai n int i rezultatul va fi int)
Operatori pe bii

Operatori de deplasare
Stnga << (se completeaz cu zero)
Dreapta >> (se completeaz cu bitul de semn)
Dreapta fr semn >>> (se completeaz zero)

Din operandul din dreapta se folosesc doar


cei mai puin semnificativi 5 bii pentru int
Pentru long se folosesc 6 bii
Operatori de conversie
(cast)
Unele conversii sunt implicite (de ex. int n float)
Sintaxa: (tip) expresie
Expresia se va converti la tip
Exemplu
long longVal = 200L;
int intVal = (int)longVal;
Conversia din float/double n int trunchiaza
numrul (Math.round() ne permite s rotunjim)
Java nu are operatorul sizeof()
Operatorul ternar

Operator condiional singurul operator


ternar
exp-bool? Valoare1: Valoare2
Dac exp-bool este adevrat se evalueaz
Valoare1 i rezultatul va fi valoarea expresiei
Dac exp-bool este fals se evalueaz Valoare2
i rezultatul va fi valoarea expresiei
Operatori pentru string-uri

Operatorul aditiv poate fi folosit pentru a


concatena string-uri
+ i +=
n Java nu putem suprancarca operatori
String + numr rezult un string
String + (numr1 + numr2) se adun prima
dat cele dou numere
Controlul execuiei

if-else
while
do-while
for
return
break
switch
goto
Controlul execuiei

Instruciunile condiionale folosesc expresii


de condiie ce trebuie s aib valoarea true
sau false, al cror tip este boolean
Tipul int nu este permis pentru expresiile
folosite ca i condiie (spre deosebire de C i
C++)
Controlul execuiei

if-else
Sintaxa
if(expresie-boolean)
Instruciune
sau
if(expresie-boolean)
Instruciune
else
Instruciune
Instruciunea poate fi simpl sau compus
Controlul execuiei

Instruciune de iteraie/repetiie
while
do-while
for
Se repet o instruciune ct timp o condiie
este adevrat/pn cnd condiia devine
fals
Controlul execuiei

while Sintaxa:
while(expresie-boolean)
Intstruciune
dowhile Sintaxa:
do
Instruciune
while(expresie-boolean);
Controlul execuiei

for Sintaxa
for(iniializare; expresie-boolean; pas)
instruciune
Oricare din cele trei expresii poate lipsi
Expresia boolean este evaluat nainte de a
executa instruciunea
Pas este executat dup instruciune
Controlul execuiei

Operatorul virgul
Virgul poate fi i separator
Poate fi folosit la instruciunea for n partea
de iniializare sau n partea de pas
Expresiile se evalueaz de la stnga la
dreapta i valoarea ntregii expresii va fi egal
cu valoarea ultimei expresii din list
Controlul execuiei

Sintaxa pentru foreach


Util pentru tablouri i containere
Random rand = new Random(10);
float f [] = new float[20];
for(int i = 0; i < 20; i++)
f[i] = rand.nextFloat();
for(float f : x)
System.out.println(f);
Controlul execuiei

Exemplu foreach
for(char c: Hello.toCharArray())
System.out.print(c);
Instruciunea foreach este mai concis dect
instruciunea for
Instruciunea for trebuie s specifice toate
detaliile pentru modul n care se face iterarea
Controlul execuiei

return, break, continue sunt instruciuni pentru


ramificare necondiionat
return
Specific valoarea ntoars de o metod (pentru
metode non-void)
Iese din metoda curent
ntr-o metod void care nu are o instruciune
return exist un return implicit la sfritul
metodei
O metod non-void obligatoriu trebuie s aib o
return pe fiecare cale de ieire din metod
Controlul execuiei

break iese din blocul instruciunii repetitive


n care apare fr a mai executa instruciunile
care urmeaz n blocul respectiv
continue oprete execuia iteraiei curente a
unei instruciuni repetitive i sare la
reevaluarea condiiei
goto n Java nu exist, cu toate c este
cuvnt rezervat
Controlul execuiei

switch instruciunea de selecie


switch(expresie de selecie ntreag)
{
case caz1: instruciune; break;
case caz1: instruciune; break;
//
default: instruciune;
}
break este opional
Expresia de selecie poate fi de tip ntreg, char, enum
Selecia nu se poate face dup float sau string
Iniializare i curare

O surs important de erori n programare


este utilizarea de variabile neiniializate i
variabile care nu se mai refer la zone de
memorie valide
Neeliberarea resurselor alocate (n principal
memoria) poate duce la epuizarea resurselor
Constructorul iniializeaz datele
Garbage collector elibereaz automat
resursele de memorie
Iniializare i curare

S-a putea crea pentru fiecare clas o metod


initialize()
Utilizatorul clasei ar putea apela aceast
metod dup crearea fiecrui obiect
Metoda constructor are tocmai acest rol de a
iniializa un obiect, fiind apelat automat la
crearea obiectului
Numele metodei constructor = numele clasei
Iniializare i curare

class X
{
X()
{
System.out.println(X());
}
}
// n metoda main
X x = new X();
Iniializare i curare

La crearea unui nou obiect cu new


Se aloc memorie
Se apeleaz metoda constructor
Iniializarea obiectului este garantat
Constructorul fr argumente = constructor
implicit
Constructorul poate avea i argumente
Putem avea mai muli constructori ntr-o clas
difer prin numrul i/sau tipul argumentelor
Iniializare i curare

class X
{
X(int i)
{
System.out.println(X() + i);
}
}
// n main
X x = new X(123);
Iniializare i curare

Argumentele constructorului ofer


posibilitatea de a furniza parametri pentru
iniializarea unui obiect
Dac nu crem nici un constructor
compilatorul creeaz automat constructorul
implicit
Dac am creat un constructor parametrizat
atunci nu vom mai avea constructor implicit
generat de compilator
Iniializare i curare

Crearea i iniializarea unui obiect sunt


concepte unificate n Java nu putem avea
unul fr altul
Constructorul nu are tip de return nici mcar
void
Operatorul new ntoarce o referin la
obiectul creat
Iniializare i curare

Un aspect important n orice limbaj de


programare este utilizarea numelor
La crearea unui obiect dm un nume unei
regiuni de stocare
O metod este un nume pentru o aciune
Alegerea adecvat a numelor creeaz un
sistem simplu de neles i de modificat
Iniializare i curare

n Java nu este obligatoriu s avem nume


distincte pentru fiecare identificator
metodele pot fi suprancrcate
Pentru a putea avea mai muli constructori /
mai multe modaliti de iniializare pentru un
obiect, trebuie s avem n limbaj posibilitatea
de a suprancrca metode
Pentru constructor putem avea un singur
nume numele clasei
Iniializare i curare

Metodele pot fi de asemenea suprancrcate


Acest concept trebuie folosit cu mare atenie
pentru a nu introduce confuzii
Vom suprancrca metode care au acelai
scop
Metodele suprancrcate trebuie s aib o
list unic de argumente
Iniializare i curare

Dou metode pot diferi i prin ordinea


argumentelor dar nu e indicat
void f(String s, int i) {}
void f(int i, String s) {}
Valorile de tip primitiv vor fi convertite (prin
conversii implicite), dac e cazul, la cel mai
apropiat tip care se potrivete ntr-una din
metodele suprancrcate
Iniializare i curare

Dou metode nu pot s difere doar prin tipul


de return
void f() {}
int f(){ return 1;}
Ar fi ok dac am avea ntotdeauna expresii de
tipul:
int x = f();
Dar putem avea i o expresie de tipul:
f(); // care f() se apeleaz?
Iniializare i curare

Cuvntul this
class X { void f(int i) { /**/}}
//
X x1 = new X(), x2 = new X();
x1.f(1); x2.f(2);
Avnd n vedere c exist o singur metoda f(),
de unde tie metoda pentru care obiect este
apelat?
n fundal compilatorul transform apelul ntr-o
expresie de forma:
X.f(x1, 1); X.f(x2,2);
Iniializare i curare

ntr-o metod sunt situaii cnd dorim s


obinem o referin la obiectul pentru care a fost
apelat
Referina este transmis de ctre compilator n
fundal
Pentru asta avem cuvntul cheie this
Poate fi folosit doar n metodele non-static
Ar trebui folosit doar atunci cnd e nevoie
Exemplu 1: initialization/Leaf.java
Exemplu 2: initialization/PassingThis.java
Iniializare i curare
Apelul unui constructor din alt constructor se
face cu cuvntul cheie this urmat de o list de
argumente
n metodele instan this este o referin la
obiectul pentru care a fost apelat metoda
n constructor this determin un apel explicit la
un alt constructor
Exemplu: initialization/Flower.java
Putem avea un singur apel, la un singur
constructor
Apelul la un constructor trebuie s fie prima
instruciune dintr-un constructor
Iniializare i curare

nelegnd cuvntul this se poate nelege mai


bine noiunea de metod static
ntr-o metod static nu putem folosi this
O metod static poate fi apelat fr s existe o
instan a clasei
Nu putem apela metode non-statice din metode
statice
Metodele statice sunt un fel de metode globale
Metodele statice pot accesa cmpuri i metode
statice
Metodele statice nu respect spiritul POO
Iniializare i curare

Iniializarea este un aspect important n


programare
Eliberarea resurselor folosite este o operaie
la fel de important
Garbage collector elibereaz memoria
alocat cu new
Pentru fiecare clas se poate defini o metod
finalize() care poate elibera resurse alocate
prin alte mijloace
Iniializare i curare

Garbage collector va apela prima dat


metoda finalize() i doar la urmtoarea
trecere prin procesul de garbage collection se
va elibera memoria alocat cu new
finalize() nu este totuna cu destructorul din
C++
ntr-un program C++ (bug-free) obiectele
totdeauna sunt distruse n destructor
n Java se poate ca ele s nu fie eliberate de
GC
Iniializare i curare

GC nu nseamn distrugere
Dac trebuie fcute diverse operaii nainte
de a ne dispensa de un obiect acestea trebuie
fcute ntr-o metod special
Java nu are conceptul de destructor
Se poate ca pentru un program GC s nu
intervin nici mcar o dat (dac sistemul nu
ajunge n situaia de a epuiza memoria)
GC implic nite costuri de timp de execuie
Iniializare i curare

GC are legtur doar cu memoria


finalize() nu ar trebui folosit ca o metod
general de curare a obiectelor
Singurul rol al GC este de a elibera memorie
ce nu mai este folosit de program prin
urmare i finalize() are trebui s aib legtur
doar cu memoria
GC va elibera i obiectele coninute de
obiectul eliberat
Iniializare i curare

Iniializarea membrilor
Java garanteaz c variabilele vor fi
iniializate n mod corespunztor nainte de a
fi folosite
void f()
{
int i; // variabilele locale nu sunt initializate implicit
i++; // Eroare de compilare i neinitializat
}
Iniializare i curare

Un membru al unei clase de tip primitiv va fi


iniializat n mod implicit la false, 0
Un membru de tip referin va fi iniializat la null
Membri unei clase pot primi o valoarea iniial n
definiia clasei
class X
{
boolean b = false;
int n = 12;
Y y = new Y(); // Y este o clas
}
Se poate folosi ca i iniializator un apel de funcie
Iniializare i curare

Constructorul ne ofer mai mult flexibilitate n


ceea ce privete iniializarea pentru c putem
apela metode i efectua diverse operaii la
execuie
Iniializarea automat are loc ntotdeauna, chiar
i dac folosim constructori
class Counter
{
int i; // i se iniializeaz la zero i dup aceea la 7
Counter() { i = 7; }
}
Iniializare i curare

Ordinea iniializrii este determinat de


ordinea n care sunt definite variabilele n
cadrul clasei
Variabilele unei clase sunt iniializate nainte
de a se putea apela o metod
Exemplu:
initialization/OrderOfInitialization.java
Iniializare i curare

Pentru date static exist o singur valoarea


indiferent de numrul de obiecte create
Variabilele locale nu pot fi static
Datele static vor primi valoarea iniial zero sau
null
Membri static de tip referin sunt creai doar
dac este nevoie. Dac nu se instaniaz clasa
sau dac nu se acceseaz nu vor fi creai
Exemplu:
initialization/StaticInitialization.java
Initialization/Mugs.java (iniializare non-static)
Iniializare i curare

Tablou = secven de obiecte sau de date


primitive toate de acelai tip mpachetate
mpreun sub acelai nume
Tablourile sunt definite i folosite cu operatorul
de indexare []
int []a; // definete un tablou
Se poate folosi i sintaxa int a[]
Astfel se creeaz doar o referin la un tablou
Pentru elementele tabloului nu s-a alocat
memorie
Iniializare i curare

Sintaxa de iniializare special pentru


tablouri:
int[] a = {1,2, 3, 4, 5}; // se poate folosi doar la
definire
Exemplu:
initialization/ArraysOfPrimitives.java
Orice tablou are un membru cu numele length
care ne spune cte elemente are tabloul
Iniializare i curare

Dac nu tim de la nceput cte elemente va


avea tabloul putem folosi operatorul new pentru
a crea elementele tabloului
int[] a = new int[10];
Exemplu: initalization/ArrayNew.java
Elementele unui astfel de tablou de elemente de
tip primitiv vor fi iniializate la zero sau false
La crearea unui tablou de obiecte se creeaz un
tablou de referine neiniializate
Exemplu: initialization/ArrayClassObj.java
Initilization/ArrayInit.java
Iniializare i curare

Liste de argumente de lungime variabil


Pre Java SE5: initalization/VarArgs.java
Java SE5: initialization/NewVarArgs.java
initialization/OptionalTrailingArguments.java
initialization/VarargType.java
Iniializare i curare

Enumerri:
enum Culori {ROSU, VERDE, VERDE_DESCHIS};
Culori c = Culori.ROSU;
Compilatorul creeaz metodele
toString()
ordinal()
values() // metod static ce produce un tablou de
valori ale enumerrii
Exemple:
initialization/EnumOrder.java
Initialization/Burrito.java
Curs pentru
MAI anul II
2011-2012 semestrul II
Lect. univ. dr. Horea Oros
Email: horea.oros@gmail.com
Universitatea din Oradea, Departamentul de Matematic i Informatic

TEHNOLOGII I PLATFORME
JAVA PENTRU APLICAII
DISTRIBUITE
Java

Tehnologia Java
Platform
Limbaj de programare
Limbajul de programare
Simplu, orientat obiect, distribuit, dinamic,
multifir, independent de arhitectur, portabil,
performan ridicat, robust, sigur
Java

Fiierele surs sunt scrise n fiiere cu extensia


.java
javac (compilatorul de Java) transform
fiierele java n fiiere .class
Un fiier .class nu conine cod nativ pentru
procesor conine bytecode limbajul pentru
JVM.
JVM Java Virtual Machine
Java

JVM exist pentru multe sisteme de


operare
JVM
Aceleai fiiere
.class pot rula
pe Windows,
Linux, Solaris,
Mac OS
Platforma Java

Platform = mediul hardware sau software n


care ruleaz un program
Combinaie ntre sistemul de operare i
hardware-ul pe care ruleaz
Plarforma Java este o platform software
only
Platforma Java
JVM
Java API (Application Programming Interface)
Java API

O colecie mare de componente software


gata fcute ce ofer o serie de funcionaliti
Este grupat n biblioteci de clase i interfee
numite pachete.
Platforma Java

Fiind un mediu independent de platform codul


va fi mai lent dect un cod nativ
Tehnologiile folosite n compilatoare i JVM fac
codul tot mai rapid
Orice implementare complet a platformei Java
ofer
Unelte de dezvoltare editare, compilare, depanare,
rulare, monitorizare, documentare
API funcionalitatea de baz a limbajului Java, clase
pentru reea, securitate, XML, baze de date etc.
Platforma Java

Orice implementare complet a platformei


Java ofer (cont.)
Tehnologii pentru instalarea aplicaiilor Java
Web Start, Java Plug-in
Unelte pentru crearea de interfee utilizator
Swing, Java 2D permite crearea de GUI foarte
sofisticate
Biblioteci pentru integrare Java IDL API, JDBC,
Java RMI etc.
Platforma Java

Cum ne poate ajuta?


Start rapid limbaj de programare mai simplu
dect C++
Vom scrie mai puin cod
Vom scrie cod mai bun
Programele vor fi dezvoltate mai repede
Vor fi evitate dependenele de platform
Codul o dat compilat poate fi rulat pe orice
platform care are JVM
Soft-ul va distribuite mai uor
Hello World, Java

package helloworldapp;
public class HelloWorldApp
{
public static void main(String[] args)
{
System.out.println("Hello World!");
}
}

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