Sunteți pe pagina 1din 38

Programare obiect orientata

PERSPECTIVA JAVA

Prof. dr. Dorin Bocu

Tipuri de date fundamentale


Datele sunt pentru programe un fel de constituienti
materiali a caror adaptare la nevoile utilizatorilor
este realizata de prelucrari.
Conceptul de data a fost inventat de om pentru a face
posibila apropierea omului de conceptul de
informatie.
Informatia este notiune primara, greu de definit si a
carei existenta nu are nevoie de recunoasterea
omului. Universul are la temelie in mod esential
informatia.

Tipuri de date fundamentale


In fata neputintei de a manevra informatia omul a
inventat datele. Distanta dintre date si informatie
este, oarecum, reflectarea in oglinda cunoasterii a
distantei dintre inteligenta naturala si inteligenta
artificiala.
Asa cum inteligenta artificiala spera la ziua in care se
va apropia oricat de mult de inteligenta naturala, si
datele viseaza, metaforic vorbind, la ziua in care se
vor pozitiona cat mai corect fata de semantica
notiunii de infornatie.

Tipuri de date fundamentale


Prin urmare:
Data este un model de reprezentare a informatiei
Pentru corectitudine, trebuie sa spunem ca aceasta reprezentare
este, inevitabil, aproximativa.
Altfel spus, reprezentarea are scapari, deliberate sau
involuntare.
Scaparile deliberate sunt acoperite sub sintagma
abstractizare. Scaparile involuntare pot fi puse pe seama legii
entropiei, care postuleaza inevitabilitatea destructurarii unui
sistem care nu face eforturi metodice de autoorganizare.

Asadar, in efortul de modelare a informatiei, fie ca


este vorba de date, fie ca este vorba de prelucrari,
informaticianul are de luptat, simultan, cu limitele
lui subiective (capacitatea de a abstractiza metodic)
dar si cu limitele obiective ale modului in care se
structureaza si restructureaza realitatea.
In ciuda concluziilor pesimiste pe care le putem
extrage din cele afirmate mai sus, modelarea datelor
este un proces ireversibil

Tipuri de date fundamentale


Notiunea de data, aproape colocviala in zilele noastre, sufera un proces de
formalizare necesara atunci cand este utilizata in informatica. Astfel, data devine
tip de data, adica una dintre abstractiile fundamentale pentru o modelare de
calitate in industria IT.
Tipul de data este punctul principal de intrare in templul informaticii,
daca mi se ingaduie exprimarea.
In tipul de data se afla micro-istoria informaticii. Si aceasta deoarece:

Tipul de data are structura;


Tipul de data are comportament;
Tipul de data necesita efort de modelare.

Ce altceva este informatica decat stradania de a modela sisteme care au


structura si comportament?

Tipuri de date fundamentale


Prin urmare, mesajul pe care as dori sa il transmit cititorilor acestei
prezentari este simplu:
Straduiti-va sa vedeti dincolo de aparente cand operati cu
tipurile de date!
Intelegerea completa si fiabila a unui tip de data este posibila doar
daca deslusim, cu rabdarea si supletea necesara, atat aspectele
utilitare ale unui tip de data cat si conotatiile lui integratoare.
Acesta este adevarul: nu exista creatie in univers care sa nu se
integreze cumva in ansamblul format de celelalte creatii.

Tipuri de date fundamentale


Asadar revenim cu picioarele pe pamant, adica in lumea perspectivei
Java
asupra tipurilor de date.
Inca nu stim ce este acela un program Java, dar vom afla in curand.
Java suporta doua tipuri de date: tipurile primitive si tipurile
obiect
(referinta).
Minunata aceasta taxonomie cu valoare explicativa. Lumea tipurilor de
date din Java este riguros organizata.
Detalii referitoare la continutul faptic al acestei lumi puteti gasi in
Internet la link-urile de mai jos si nu numai:
http://java.sun.com/docs/white/langenv/Simple.doc1.html
http://www.tutorialspoint.com/java/java_basic_datatypes.htm
http://www.angelfire.com/tx4/cus/shapes/covariance.html

Tipuri de date fundamentale


Tipuri de date primitive
Tipuri intregi

byte (8 biti)

Tipul byte se reprezinta cu semn in cod complementar


Valoarea minima: -128 (-2^7)
Valoarea maxima: 127 (inclusiv)(2^7 -1)
Valoarea implicita: 0
Este folosit pentru a face economie de memorie in cadrul tablourilor
mari daca poate inlocui tipul int.
Operatiile permise sunt operatiile aritmetice: adunarea, scaderea,
inmultirea si impartirea; Se cuvine sa remarcam faptul ca
impartirea a doua numere de tip byte, atunci cand are sens, are ca
rezultat catul impartirii.

Tipuri de date fundamentale


short (16 biti)

Tipul short se reprezinta cu semn in cod complementar pe 16 biti;


Valoarea mini9ma: -32,768 (-2^15);
Valoarea maxima: 32,767(inclusiv) (2^15 -1);
Tipul short se poate folosi, ca si tipul byte pentru a face economie
de memorie.
Valoarea implicita: 0.
Consideratiile referitoare la operatiile permise sunt asemenea
celor de la tipul byte.

Tipuri de date fundamentale


int (32 biti)

Tipul int se reprezinta pe 32 de biti, cu semn, in cod


complementar;
Valoarea minima: - 2,147,483,648 (-2^31);
Valoarea maxima: 2,147,483,647(inclusiv) (2^31 -1);
Tipul int este n general utilizat ca tip implicit de
data pentru valorile intregi, cu excepia cazului n care
exist o preocupare cu privire la consumul de memorie.
Valoare implicita: 0.

Tipuri de date fundamentale


long (64 biti)

Tipul long se reprezinta pe 64 de biti, cu semn, in cod complementar;


Valoarea minima:-9,223,372,036,854,775,808 (-2^63);
Valoarea maxima: 9,223,372,036,854,775,807 (inclusiv) (2^63 -1);
Este folosit atunci cand ordinele de marime suportate de int sunt
nesatisfacatoare;
Valoarea implicita: 0L.
Exemple : long a = 100000L, long b = -200000L

Relativ la tipul long, trebuie spus ca pentru a intra in gratiile

compilatorului Java este bine sa apelam la notatia consacrata pentru


literale de tip long (123456789L). In absenta caracterului L compilatorul
va considera ca 123456789 este un intreg care depaseste capacitatea de
reprezentare a celui mai incapator intreg de capacitate mai mica decat
long. Eroarea este semnalata chiar daca receptorul este de tip long.

Tipuri de date fundamentale


Numere reale in virgula mobila
float (32 biti)

Tipul float este reprezentarea in simpla precizie (32 biti) a


numerelor reale in virgula mobila standard EEE 754 .
Este folosit pentru a economisi memorie interna in cazul in
care se lucreaza cu tablouri mari de numere reale.
Valoare implicita: 0.0f.
Tipul float nu exceleaza la capitolul precizie.
Exemplu : float f1 = 234.5f

Tipuri de date fundamentale


double (64 biti)

Tipul double este reprezentarea pe 64 de biti a numerelor reale


in virgula mobila, conform standardului IEEE 754.
Tipul double este implicit cand se lucreaza cu numere
zecimale.
Valoare implicita: 0.0d.
Exemplu : double d1 = 123.4

boolean

Tipul boolean folosete efectiv un bit pentru a reprezenta cele


doua valori posibile: true si false.
Valoare implicita: false.
Exemplu : boolean one = true

Tipuri de date fundamentale


char (16 biti)

Tipul serveste la reprezentarea unui singur caracter Unicode pe 16


biti.
Valoare minima: '\u0000' (or 0).
Valoare maxima: '\uffff' (or 65,535 inclusiv).
Exemplu : char letterA ='A'

Tipul caracter joaca un rol important in functionarea


sistemului I/O al aplicatiilor Java. In structura Unicode
sunt codificate sau urmeaza sa fie codificate majoritatea
limbilor vorbite pe Tera. Vechiul cod ASCII se regaseste,
de asemenea, in logica structurarii Unicode.

Tipuri de date fundamentale


Pentru a va forma o idee in legatura cu importanta secventelor escape ca varianta de

lucru cu caracterele in Java puteti vizita link-ul:


http://code.cside.com/3rdpage/us/javaUnicode/converter.html
De asemenea, mai jos sunt prezentate niste exemple de utilizare a secventelor escape
pentru a manipula o serie de caractere care tin de limba greaca:
.
System.out.println("\u00f7\u2713"); //
System.out.println('\u03a0'); // PI upper
System.out.println('\u03C0'); //PI lower
System.out.println('\u03F0'); //Kappa upper
System.out.println('\u03A9'); // Omega upper
System.out.println('\u03A3'); //Sigma upper
.

Tipuri de date fundamentale


Literalii Java

Un literal in Java este reprezentarea direct in codul


sursa a unei valori fixe. Putema vea, fireste, literali
numerici si alfanumerici.
Exemple:
144 - intreg;
144L -intreg compatibil long;
010 -intreg in octal (echivalentul lui 8 din baza 10);
0x10 -intreg in baza 16 (echivalentul lui 16 din baza 10);
12.5- numar real;
12.5f - numar real virgula mobila simpla precizie;

Tipuri de date fundamentale


A -caracterul A;
Buna! -literal sir de caractere;
\u03A3 -caracterul Sigma;
In structura unui sir de caractere putem include si secvente escape, precum:
\n -new line;
\r -carriage return;
\t -tab;
\f -form feed;
\b -backspace;
\ -ghilimele;
\\ -backslash;
\ddd -caracter octal;
\uxxxx -caracter unicode;
etc.

Tipuri de date fundamentale


Tipul enumerare
public static enum Operation {
PLUS, MINUS, TIMES, DIVIDE;
// Do arithmetic op represented by this constant
double eval(double x, double y){
switch(this) {
case PLUS: return x + y;
case MINUS: return x - y;
case TIMES: return x * y;
case DIVIDE: return x / y;
}
throw new AssertionError("Unknown op: " + this);
}
}

Tipuri de date fundamentale


Un exemplu complet de utilizare enumerare definire tip
enumerare
package enumer;
/**
*
* @author Administrator
*/
public enum ZileSapt {
Luni, Marti,Miercuri, Joi, Vineri,Sambata,Duminica
}

Tipuri de date fundamentale


Utilizare tip enumerare in interiorul unei clase
package enumer;
public class TestEnum {
ZileSapt day;
public TestEnum(ZileSapt day) {
this.day = day;
}
public void CumEsteZiua() {
switch (day) {
case Luni: System.out.println("Luni este rau");
break;
case Vineri: System.out.println("Vineri este ma bine");
break;
case Sambata:
case Duminica: System.out.println("Cel mai bine este in weekend..");
break;
default: System.out.println("La mijloc de saptamana...asa si asa");
break;
}
}
}

Tipuri de date fundamentale


Testare tip enumerare
package enumer;
public class Main {
public static void main(String[] args) {
TestEnum firstDay = new TestEnum(ZileSapt.Luni);
firstDay.CumEsteZiua();
TestEnum thirdDay = new TestEnum(ZileSapt.Miercuri);
thirdDay.CumEsteZiua();
TestEnum seventhDay = new TestEnum(ZileSapt.Duminica);
seventhDay.CumEsteZiua();
}
}

Tipuri de date fundamentale


Clasa in Java
Clasa este in Java instrumentul logic cu ajutorul

caruia definim tipuri de obiecte, adica acel tip de


data fundamental atat pentru economia de resurse a
unui program cat si pentru stilul in care este realizat
programul.
Povestea clasei o vom prezenta in extenso in alta
prezentare.

Tipuri de date fundamentale


Tipul adnotare (annotation)

http://download.oracle.com/javase/tutorial/java/javaOO/anno
tations.html
http://www.eclipse.org/aspectj/doc/released/adk15notebook/
annotations.html
http://download.oracle.com/javase/1.5.0/docs/guide/languag
e/annotations.html

Tipuri de date fundamentale


Tipul adnotare ajuta la furnizarea unor date despre program, date

care nu sunt parte efectiva a programului in sens clasic.


Adnotarile au cateva intrebuintari, dintre care esentiale sunt:
Informatii pentru compilator Adnotarile pot fi folosite de
compilator pentru a detecta erori sau suprima avertismentele.
Procesare in timpul compilarii sau deployment-uluiMediile de programare pot procesa informatiile de adnotare
pentru a genera cod, fisiere XML, s.a.m.d.
Procesare Runtime Anumite adnotari sunt disponibile
pentru a fi consultate in timpul executiei programelor.
Adnotarile se pot aplica declaratiilor diferitelor componente ale
unui program (clase, date membre, metode membre, etc. )

Tipuri de date fundamentale


Lucrul cu adnotari in Java presupune:
1. Definirea tipului de adnotare;
2. Utilizarea adnotarii, acolo unde este cazul.

Adnotarea este un fel de interfata prin intermediul careia trimitem


informatii structurate mediului de programare sau executie
Sintaxa de definire a unui tip de adnotare:
@interface AdnotareaMea {
String author();
String date();
int currentRevision() default 1;
String lastModified() default "N/A";
String lastModifiedBy() default "N/A";
String[] reviewers(); // Note use of array }

Tipuri de date fundamentale


Utilizare adnotare

import java.lang.annotation.*;
import java.lang.reflect.*;

@Documented
@Retention(RetentionPolicy.RUNTIME)
@interface Adnotare {
String Autor();
String data();
}

public class Main {

// Adnotare metoda folosind un marker.


@Adnotare(Autor="Dorin Bocu",data="15-03-2011")
public static void myMeth() {
Main ob = new Main();

try {
Method m = ob.getClass().getMethod("myMeth");

Adnotare adno = m.getAnnotation(Adnotare.class);

System.out.println(adno.data()); // displays 100

} catch (NoSuchMethodException exc) {


System.out.println("Method Not Found.");
}
}

public static void main(String args[]) {


myMeth();
}

Tipuri de date fundamentale


Clase wrapper pentru tipurile fundamentale
http://download.oracle.com/javase/tutorial/java/data/numberclasses.html

Tipuri de date fundamentale


Prezentare sintetica a clasei wrapper java.lang.Integer
Constructor
Integer(i)
Integer(s)

Metode uzuale

Responsabilitati
Construieste o instanta a clasei Integer pe baza
parametrului I
Construieste o instanta a clasei Integer pe baza valorii
continuta in paramerul s de tip String

Metoda

Tipul

Responsabilitate

intValue()

Instanta

Returneaza o reprezentare int a


obiectului

toString()

Instanta

Returneaza o reprezentare String a


obiectului

valueOf(s)

Static

Returneaza obiectul de tip Integer


corespunzator valorii reprezentata ca
sir de caractere in s

parseInt(s)

Static

Returneaza un int corespunzator


valorii reprezntata de String-ul s

Operatori in Java
Operatorul de atribuire:

=
Desi trece neobservat, operatorul de atribuire este
fundamental pentru programarea procedurala, care
pare a fi tipul de programare cel mai apropiat de
stilul de gandire si operare al omului.

Operatori in Java
Operatori aritmetici:

+ Adunare (se poate folosi si la concatenarea


sirurilor de caractere);
- Scadere;
* Inmultire;
/ Impartire;
% Clasa de resturi modulo.

Operatori in Java
Operatori unari:
+ Operatorul unar plus; indica valoarea pozitiva a unui

numar sau a unei expresii;


- Operatorul unar minus; aplica semnul minus unei
expresii;
++ Operatorul de incrementare cu o unitate a unui contor
ordinal;
-- Operatorul de decrementare cu o unitate a unui contor
ordinal;
! Operatorul de complementare logica a unei valori
booleene.

Operatori in Java
Operatori relationali
==

Egal cu
!= Nu este egal cu
> Mai mare decat
>=
Mai mare sau egal cu
< Mai mic decat
<=
Mai mic sau egal cu

Operatori in Java
Operatori conditionali

&&
||
?:

AND
OR
Prescurtare pentru enuntul if-then-else

Exemplu de utilizare a celui de-al treilea operator:


Rezultat = Conditie ? valoare1 : valoare2;

Operatori in Java
Operator de comparare a obiectelor
instanceof - compararea unui obiect cu un tip dat;

evident operatorul poate fi utilizat in timpul


executiei pentru a stabili clasificatorul pe baza caruia
a fost creat un obiect la un moment dat. Operatorul
devine cu adevarat interesant in contextul in care in
programarea OO exista si relatia de mostenire si
posibilitatea de a interschimba clasele cu interfetele.

Operatori in Java
Operatori la nivel de bit

~ Complement fata de 1 al operandului


<< a<<b ; shift-are a la stanga cu b pozitii;
>>
a>>b ; shift-are a la dreapta cu b pozitii, cu
propagare bit de semn;
>>> a>>>b ; shift-are a la dreapta cu b pozitii, fara
propagare bit de semn;
& a & b ; si logic la nivel de bit intre operanzi;
^ a ^ b ; sau logic exclusiv la nivel de bit intre operanzi;
| a | b ; sau logic la nivel de bit intre operanzi.

Operatori in Java
Expresii prescurtate in Java
Este vorba de atribuiri si expresii in strcutura carora

intra operatorii de incrementare/decrementare.


Exemple:
I++; echivalent cu I=I+1 dupa ce valoarea lui I inainte
de incrementare a fost valorificata in context;
++I; echivalent cu I=I+1 inainte ca valoarea lui I sa fie
valorificata in context;
I+=10; echivalent cu I=I+10;
Etc.