Sunteți pe pagina 1din 21

Esența aproape oricărui limbaj de programare stă în posibilitatea de a

procesa diferite valori logice, numerice sau textuale. Pentru a gestiona


datele dintr-un limbaj de programare, trebuie să cunoaştem tipurile de
date susţinute de acest limbaj. Tipurile de date diferă de la limbaj la
limbaj, dar diferenţele sunt cel mai des doar "cosmetice" (diferă
numele lor) şi nu reale şi în general toate limbajele au tipuri de date
caracteristice cu, eventual, nişte nume diferite. Un tip identifică un set
de valori și reprezentarea lor în memorie, precum și operațiile care pot
fi efectuate asupra acestui set de valori.

Ce este un tip de dată şi la ce foloseşte?

Deja am spus că unele date se prezintă în program prin nişte tipuri,


ceea ce permite programului să nu se "încurce" când trebuie să le
gestioneze. Dacă am întreba pe cineva câţi ani are şi dacă persoana
respectivă ne-ar răspunde : "Ion", probabil că ne-am încurca. Ar fi şi
mai rău dacă ar trebui să calculăm vârsta medie, dar înainte de asta să
fi obţinut informaţia schimbată referitoare la vârstă (Ion). În acest caz,
o simplă calculare a vârstei medii ar fi, practic, imposibilă.

Unele limbaje de programare (de nivel înalt) sunt capabile să trateze


singure această problemă (de exemplu, dacă trimitem un text în locul
unui număr, acesta este tratat ca numărul zero şi alte soluţii
asemănătoare), dar unele nu. Java cere tipuri de date identificate în
mod explicit, fapt pentru care aparţine grupului de limbaje de
programare Strongly Typed. Aceasta înseamnă că, dacă în Java
spunem că aşteptăm un număr şi în schimb trimitem un text,
programul nu va fi tradus.

Să ne întoarcem la exemplul cu vârsta. Care este de fapt tipul de date


pe care îl aşteptăm după ce întrebăm interlocutorul câţi ani are? Este
evident că e vorba de un număr, dar acest număr poate fi întreg sau
zecimal. Interlocutorul ne poate răspunde 25 sau 25 şi jumătate. Dacă
ne-am aştepta să ne spună un număr întreg şi el ne spune un număr
zecimal, am pierde partea de după virgulă. De aceea, se poate spune
că cea mai sigură variantă este să presupunem că numărul aşteptat va
fi zecimal, pentru că atunci nu există posibilitatea să pierdem nicio
informaţie. Pe lângă tipul de număr, este foarte importantă şi mărimea
numărului gestionat. În creierul uman, alocarea memoriei se întâmplă
în mod dinamic, dar în programul de calculator nu. Odată ce am ocupat
un spaţiu în memorie unde intenţionăm să păstrăm un număr, acest
spaţiu rămâne ocupat până la dealocare sau până la oprirea
programului. Este foarte important cât de mare va fi acest spaţiu,
pentru că acesta afectează în mod direct memoria disponibilă a
mediului. Dacă vorbim de vârsta unui om, ştim că nu există
posibilitatea ca cineva să trăiască mai mult de 150 de ani. De
asemenea, ştim că vârsta unui om nu poate fi prezentată printr-o
valoare negativă. Deci, pentru salvarea vârstei umane este suficient
cel mai mic număr zecimal cu virgulă mobilă.

Tipuri de date în Java

Practic, toate limbajele de programare au o clasificare generală a


tipurilor de date în simple (primitive) şi compuse. Acest lucru se aplică
și limbajului de programare Java, unde avem tipuri primitive și de
referință. Veți auzi termeni precum tipuri obiectuale sau de clasă.
Acestea reprezintă un sinonim pentru termenul tip de referință. Tipurile
de referință, obiectuale sau de clasă se referă la același lucru. Fiecare
dată, indiferent dacă este primitivă sau de referință, ocupă un anumit
loc în memorie. Datele primitive sunt salvate în partea statică a
memoriei care se numește Stack, unde își ocupă spațiul alocat în
timpul activării programului. Tipurile obiectuale sunt alcătuite de obicei
dintr-unul sau mai multe tipuri primitive cu caracteristici și/sau
funcționalități suplimentare. Astfel de tipuri se află de obicei în partea
dinamică a memoriei (Heap), în timp ce în partea statică se află doar
adresa care indică valoarea lor reală din memoria dinamică. Motivul
este dimensiunea diferită a memoriei pe care o pot ocupa tipurile de
referință și cele primitive. După cum veți vedea mai târziu în lecție,
tipurile de date primitive necesită întotdeauna aceeași cantitate de
memorie pentru a stoca valoarea datelor. Fiecare tip de date primitive
are o valoare maximă definită de memorie pe care o poate ocupa. Nu
acesta este şi cazul tipurilor de referință care, după cum am mai spus,
sunt alcătuite din tipuri primitive și pot ocupa o cantitate aleatorie de
memorie.

Dacă scriem următorul cod, modul în care variabilele sunt stocate în


memorie corespunde reprezentării din imaginea de mai jos.

MyObject obj = new MyObject(); // referinţă la obiect


int variableNum = 32; // valoare
int[] anArray; // referinţă la şir

Imaginea 7.1 Stack și heap

Toate tipurile primitive reprezintă în mod simultan tipuri built-in sau


încorporate. Tipurile de referință despre care vom vorbi mai târziu sunt
de asemenea built-in. Însă, un tip de referință poate fi și user-defined,
lucru pe care îl vom vedea mai târziu în modulul despre programarea
orientată pe obiect.
Tipuri de date primitive

Nucleul limbajului de programare Java este alcătuit din 8 tipuri de date


primitive încorporate care se mai numesc simple sau elementare.
Cuvântul primitiv este folosit aici pentru a indica faptul că aceste tipuri
de date nu reprezintă obiecte, ci valori binare obișnuite.

Java definește cu strictețe sfera de utilizare și comportamentul fiecărui


tip de dată primitivă definit în cadrul mașinii virtuale Java. Aceste reguli
trebuie respectate în mod consecvent pentru ca portabilitatea, care a
făcut celebru acest limbaj, să fie posibilă. De exemplu, tipul de dată int
rămâne același, indiferent de platforma pe care este executat. Acest
lucru permite programelor să fie complet portabile. Deși această
specificație strictă legată de dimensiunea maximă a tipurilor primitive
poate conduce la mici pierderi în ceea ce privește performanța pe
anumite platforme, ceea ce este necesar este să obținem portabilitate.

Java recunoaşte următoarele tipuri primitive:

Tip de dată Sens Mărimea în Mărimea în


octeți valori

boolean Reprezintă 1 True sau false


valorile (0 sau 1)
true/false
byte Valoare 1 De la -128 până
întreagă de 8 la 127
biți
char Caracter 2 65535
double Valoare cu 8 ±1.7976931348
dublă precizie şi cu 6231570E+308
virgulă mobilă

float Valoare cu 4 ±3.40282347E


virgulă mobilă +38F
int Valoare 4 -2,147,483,648
întreagă până la
2,147,483, 647
long Valoare 8 -9,223,372,036,
întreagă lungă 854,775,808L
până la 9,223,3
72,036,854,775
,807L
short Valoare 2 -32,768 până la
întreagă scurtă 32,767

În tabelul de mai sus, putem vedea un bilanț al tipurilor de date


primitive care există în limbajul Java. Tabelul afișează și spațiul pe care
îl ocupă aceste tipuri de date în memorie, precum și intervalul de valori
pe care îl pot avea. Mărimile prezentate în lista de mai sus sunt simplu
de obţinut. Dacă ştim că unui tip i se permite să ocupe o mărime de un
octet, aceasta înseamnă că e vorba de mărimea de 8 biţi. Opt biţi este,
de fapt, 2 la puterea 8, din care obţinem numărul 256, ceea ce
reprezintă valoarea maximă care încape în acest interval.

Tipurile simple se declară prin numele tipului urmat de numele


variabilei:

int myVariable;

Această linie declară variabila ”myVariable” de tip int.

Tipurile întregi

Java definește 4 tipuri de tipuri de date întregi: byte, short, int și long.

Cea mai des folosită valoare întreagă este int, iar utilizarea ei în limbaj
este variată. Se folosește în controlul buclei, pentru indexarea șirurilor
sau în expresii matematice generale cu valori întregi. Dacă vrem să
definim o variabilă de tip int cu valoarea 10, putem scrie:

int x = 10;
Când avem nevoie de o valoare întreagă cu un interval mai mare decât
int, folosim long. Priviți exemplul:

Imaginea 7.2 Exemplu de tip de date int care își depășește intervalul

Având în vedere că am încercat să inițializăm variabila cu o valoare


care depășește intervalul tipului de date int, editorul va afișa un mesaj
de eroare. Dacă acum am schimba tipul de date în long, editorul va
afișa în continuare același mesaj.

Imaginea 7.3 Definire incorectă a tipului de date long

Probabil vă întrebați de ce editorul afișează în continuare mesajul de


eroare deși am modificat tipul de date. Motivul stă în faptul că JVM
tratează toate valorile întregi ca tip int, dacă nu specificăm altfel. Ca să
accentuăm traducătorului faptul că vrem să inițializăm o variabilă
întreagă de tip long (64 biți), trebuie să adăugăm literele L sau l la
sfârșitul valorii. Vă recomandăm să utilizați majuscula L pentru a evita
potențiala confuzie cu numărul 1.

public static void main(String[] args)


{
long variableA = 21474836474532L; // trebuie să fie L la sfârşitul numărului
}

Cel mai mic tip de date întregi este byte. Acest tip de date din limbajul
Java este de 8 biți. Aceasta înseamnă că valoarea minimă este -128, iar
cea maximă 127. Variabilele de acest tip sunt utile în mod special când
operăm cu date binare brute, incompatibile în mod direct cu tipurile de
date Java încorporate. Folosirea acestui tip este utilă în mod special
când trebuie să economisim memorie.

Tipul de date întregi cu un interval puțin mai mare decât byte-ul, este
short. Short are 16 biți. Similar lui byte, tipul short se utilizează în
situațiile în care trebuie să economisiţi memorie. Acest tip se folosește
rar în programarea aplicaţiilor desktop, însă este folosit intens pentru
dispozitivele electrocasnice și cele de larg consum, când utilizăm ediția
Java ME.

Concret, o variabilă de tip int poate fi iniţializată prin trei sisteme


numerice: zecimal, octal și hexazecimal. Notaţia zecimală se foloseşte
cel mai frecvent şi este implicită. Dacă scriem int x=5; traducătorul o
va înţelege ca iniţializare a valorii zecimale. Dacă dorim ca valoarea să
fie octală, adăugăm un zero în faţa numărului. De exemplu, dacă am
scrie int i=010; nu am obţine numărul zece, cum poate ne aşteptăm, ci
numărul 8, deoarece prin cifra zero îi aducem la cunoştinţă
traducătorului că vom reprezenta valoarea în mod octal. Dacă dorim să
introducem o valoare hexazecimală, punem marcajul 0x în faţa
numărului, așa că după linia int x=0xF; variabila x va avea valoarea
15, deoarece în sistemul hexazecimal, acest număr este reprezentat
prin marcajul F. Următoarele linii de cod demonstrează inițializarea
variabilei 26 în formatul zecimal, octal și hexazecimal (prefixul Ob):

int decVal = 26;


int octVal = 032; // 2 * 8^0 + 3 * 8^1 = 2 + 24 = 26
int hexVal = 0x1a; // 10 * 16^0 + 1 * 16^1 = 10 + 16 = 26
int binVal = 0b11010; // 2^1 + 2^3 + 2^4 = 2 + 8 + 16 = 26

Tipuri cu virgulă mobilă

Tipurile cu virgulă mobilă reprezintă numerele cu punct zecimal. Există


două tipuri de acest fel: float și double.

Dacă vrem să prezentăm constanta Pi în programul Java, o putem face


utilizând un număr cu virgulă mobilă:

double PI =3.14;

Float reprezintă un tip de date cu precizie standard sau cu simplă


precizie, de 32 de biți. La fel ca și atunci când utilizăm tipuri short și
byte, este convenabil să utilizăm float în cazurile în care trebuie să
economisim memorie, în secvențe mari de numere cu virgulă mobilă.
Nu recomandăm utilizarea tipului float în situațiile în care avem nevoie
de o mare precizie, precum în lucrul cu valutele.

Tipul de date double este un tip de date cu dublă precizie, cu alte


cuvinte, un tip de date cu o sferă extinsă și cu lățimea de 64 de biți. La
fel cum o variabilă de tip long este reprezentată ca int atunci când este
scrisă fără litera L, fiecare variabilă numerică cu virgulă mobilă este, în
mod implicit, de tip double. Iată un exemplu în acest sens:
Imaginea 7.4 Definiție incorectă a tipului float

Dacă am încerca să inițializăm variabila de tip float, editorul ar raporta


o eroare. Am definit o variabilă de tip float, dar valoarea pe care am
scris-o, 3434.4245, este tratată de traducătorul Java ca double. Dacă
am specifica în mod explicit compilatorului că vrem să inițializăm o
variabilă cu precizie redusă, adică o variabilă de tip float, putem face
aceasta adăugând litera F la sfârșitul valorii numerice.

float variableA = 3434.4245F;

Vă sfătuim să evitați variabilele de tip float, dacă nu trebuie neapărat


să le folosiți.

Caracterele

În Java, caracterele nu sunt mai lungi de 8 biți, la fel ca în majoritatea


limbajelor de programare. Spre deosebire de alte limbaje, Java
folosește Unicode. Unicode definește seturi de caractere ce reprezintă
caracterele care apar în toate limbile umane. Probabil ați ghicit că
motivul constă în faptul că una dintre caracteristicile cheie ale
limbajului Java este portabilitatea.

Tipul de date char din Java este o valoare pozitivă de 16 biți care poate
avea un interval de la 0 la 65,536.
Unei variabile char îi putem atribui valoarea unui caracter utilizând
ghilimelele simple ca în exemplul:

char ch;
ch = 'X';

Prima linie declară o variabilă de tip char al cărui nume este ch, iar în a
doua linie, acestei variabile îi atribuim valoarea X.

Caracterele Escape

În Java, un caracter precedat de un backslash primește o semnificație


specială și este interpretat diferit de compilator. Această combinație
este cunoscută ca o secvență escape. În următorul tabel, puteți vedea
o listă a acestor caractere însoțite de scurte explicații.

Secvenţă Descriere
Ecasape
\t spaţiu tab
\b backspace
\n rând nou
\r întoarcere la
începutul
rândului
\' ghilimele
simple
\" ghilimele
duble
\\ backslash

Puteți exersa utilizarea acestor secvențe de caractere pe programul


pentru începători din primul modul. Așadar, dacă am scris următoarele
în cadrul metodei main a unei aplicații Java:

System.out.println("Hello\tWorld");
ca rezultat, vom obține aceste două cuvinte scrise cu un spaţiu tab
între ele:

Hello World

Dacă am defini mesajul astfel:

System.out.println("HelloWorld\b\b\b\b\b");

rezultatul va arăta astfel:

Hello

având în vedere faptul că am șters 5 caractere cu secvența \b.

În următorul tabel, puteți vedea rezultatele obținute de aceste


secvențe speciale de caractere în exemplul nostru:

Comandă Rezultat
System.out.println Hello World
("Hello\tWorld");
System.out.println Hello
("HelloWorld\b\b\b\
b\b");
System.out.println Hello World
("Hello\nWorld");
System.out.println Hello World
("Hello\rWorld");
System.out.println 'HelloWorld'
("\'HelloWorld\'");
System.out.println "HelloWorld"
("\"HelloWorld\"");
System.out.println This is a backslash
("This is a \
backslash \\");
Dacă am vrea să scriem literal aceste secvențe de caractere la ieşire,
am putea s-o facem adăugând un alt backslash la început. Și ar arăta
astfel:

System.out.println("Combinația caracterelor \\n are drept rezultat


începutul unui \nnou rând.");

După executarea codului de deasupra, rezultatul va arăta astfel:

Combinația caracterelor \n are drept rezultat începutul


unui nou rând.

Tipul condițional – Boolean

Tipul condițional boolean reprezintă valorile logice true/false. Java


definește utilizarea valorilor logice prin utilizarea cuvintelor cheie
true/false.

Tipul boolean este reprezentat în tabel ca un tip de date cu un singur


bit care poate avea valoarea 0 sau 1. Însă, valoarea acestui tip este
reprezentată de obicei cu valorile true sau false și este adesea utilizată
în cod, în special în controlul fluxului. Adesea, chiar și inconștient
manipulăm acest tip de date în programare, deoarece fiecare expresie
care trebuie verificată are de obicei drept rezultat o valoare de acest
tip. Pentru a inițializa o variabilă cu o valoare de acest tip, folosim
aceeași sintaxă ca și în cazul altor tipuri primitive:

boolean x = true;

sau

boolean x = false;

Clasele Wrapper ale tipurilor de date primitive


Fiecare dintre cele opt tipuri de date primitive posedă o clasă adecvată
care permite anumite opțiuni suplimentare asupra tipurilor de date,
care altfel nu ar fi posibile. După cum ne spune și numele lor, ne putem
gândi la aceste clase ca la un tip de „ambalaj” care unește tipurile
primitive cu un pachet de funcții suplimentare care pot fi efectuate
asupra lor.

Tip primitiv Clasă

byte Byte
short Short
int Integer
long Long
float Float
double Double
boolean Boolean
char Character

Vom ilustra acest lucru printr-un exemplu, unde vom instanția o


variabilă a tipului primitiv int și un obiect de tip Integer.

int x =5;
Integer x=5;

În ambele cazuri, x va avea valoarea 5 la final, deși în fundal se va


desfășura o logică complet diferită. Mai întâi, în timpul inițializării lui
int, valoarea variabilei va fi stocată direct în partea statică a memoriei,
în timp ce în cazul lui Integer, doar adresa obiectului va fi stocată în
partea statică, în timp ce obiectul în sine va fi localizat în partea
dinamică a memoriei (Heap). Spre deosebire de inițializarea prin
cuvântul cheie int, acum avem un set de funcții care pot fi executate
asupra acestei variabile, deoarece nu mai este un tip primitiv, ci un
obiect.

Următorul exemplu va arăta tipul exact al variabilei x:

Integer x=5;
// metoda getClass() returnează clasa obiectului unde este apelată
System.out.println(x.getClass());

Rezultatul va arăta astfel:

class java.lang.Integer

La introducerea marcajului . după valoarea x, dacă folosiţi mediul


NetBeans, apare lista funcţiilor disponibile şi a proprietăţilor obiectului
actual.

Imaginea 7.5 Utilizarea tipului Integer

Toate aceste elemente se pot aplica asupra obiectului actual.

De exemplu, putem compara obiectul actual cu un alt obiect sau


valoare:
Integer x=5;

// metoda equals() compară 2 obiecte, şi returnează valoarea boolean


System.out.println(x.equals(6));

Rezultatul acestui cod este valoarea false scrisă la ieşire (în fereastra
Output a lui NetBeans).

Evident că Integer este o structură de date complexă care conţine


multe caracteristici adiţionale, pe care int nu le are. Putem spune liber
că, dacă am prezenta valoarea completă a tipului Integer, nu am
obţine doar valoarea 5, ci şi o mulţime de proprietăţi ale acestui obiect.
Pe de altă parte, int are doar valoarea 5 care este unica reprezentare
purtată de acest tip.

Obiectele Integer trebuie folosite doar atunci când e nevoie de ele.


Dacă trebuie să efectuăm anumite calcule cu valori întregi, ar trebui să
folosim întotdeauna tipuri de date primitive, deoarece permit o
executare mult mai rapidă.

Conversia tipurilor de date primitive

Când creăm o variabilă de un anumit tip, nu înseamnă că vom rămâne


veşnic în acest tip. Dimpotrivă, putem transforma o variabilă dintr-un
tip în altul foarte simplu. Bineînţeles, numai dacă condiţiile pentru
conversie sunt respectate. De exemplu, dacă avem o valoare de tip
text (de exemplu, "textul meu"), o astfel de valoare nu se poate
converti într-un număr pentru că nu conţine nimic care să reprezinte o
valoare numerică. Pe de altă parte, numărul zecimal 3.14 se poate
converti foarte simplu într-o valoare întreagă, rotunjind partea de după
virgulă la valoarea dorită. Încă şi mai uşor este să transformăm un
număr întreg în număr zecimal, adăugând virgula zecimală şi un zero
după ea. Toate tipurile simple au, în reprezentarea lor obiectuală
(clasele wrapper), şi metode pentru conversie.

În concluzie, putem defini două tipuri de conversie care pot avea loc
între tipurile de date primitive. Una are loc în situația în care încercăm
să convertim un tip mai mic într-unul mai mare. Prin mic și mai mare
înțelegem cantitatea de memorie pe care o ocupă data.

Conversia implicită

Conversia implicită este o conversie efectuată în mod automat de JVM


și are loc în situațiile în care încercăm să convertim o dată mai mică
într-una mai mare. În acest caz, o dată mai mică este extinsă, iar
conversia se efectuează fără pierderi de informații. Iată un exemplu.

int x = 10; // 4 bytes


double y = x; // 8 bytes (conversia implicită: int->double)
System.out.println(y);

În exemplul de mai sus, am declarat și inițializat o variabilă de tip int,


numită x. Are valoarea 10. Apoi am convertit această variabilă într-o
variabilă de tip double. Conversia a fost efectuată implicit de JVM, iar
rezultatul este:

10.0

Conversia explicită

Dacă vrem să convertim o dată mai mare într-o dată mai mică, nu ne
putem baza pe JVM să facă acest lucru pentru noi. Acțiunea de a
converti o dată care ocupă mai multă memorie într-una care ocupă mai
puțină memorie este problematică. În cazul conversiei implicite situația
este simplă. Tipului mai mic i se adaugă biții inexistenți și nu există
pierderi de informații. Având în vedere că acum avem o situație opusă,
trebuie să ne așteptăm la pierderi de informații. De asemenea, trebuie
să afirmăm în mod explicit că dorim să efectuăm conversia. Dacă
scriem:
double x = 10.5;
int y = x; // eroare! se ajunge la pierderea informaţiilor

editorul va raporta o eroare:

Imaginea 7.6 Conversia explicită

Pentru a efectua o asemenea conversie, trebuie să o declarăm în mod


explicit. De aceea trebuie să scriem:

double x = 10.5;
int y = (int) x; // trebuie să se exprime în mod explicit double în int
System.out.println(y);

Specificând tipul în care vrem să convertim o variabilă, între paranteze


înainte de numele variabilei, efectuăm conversia explicită. De data
aceasta, conversia noastră va reuşi, iar rezultatul va fi:

10

Vedem că în acest tip de conversie, se pierde din informație, adică din


precizie. Un număr cu virgulă va fi rotunjit la valoarea sa întreagă, iar
partea de după virgulă va fi ignorată.
Singurul tip de dată ale cărui variabile nu pot fi atribuite variabilelor de
alt tip este boolean. Nu putem efectua conversia explicită sau implicită
a tipului boolean. Tot ce putem face este să atribuim unei variabile
boolean valoarea unei alte variabile boolean.

boolean x = true;
int y = x; //an error will be reported (incopatible types: boolean cannot be converted to int) */

boolean x = true; int y = (boolean)x; // an error will also be reported (incopatible types: int can
not be converted to boolean) */

Povestea conversiei între tipuri nu se oprește aici, fiindcă putem


efectua conversia şi între tipurile primitive și complexe (obiectuale).
Despre conversii vom vorbi mai mult când vom stăpâni principiile lui
OOP în Java.

Stringul – un tip special

Pentru a gestiona valorile textuale în limbajul de programare Java, vom


folosi tipul String. Este mult mai convenabil să gestionăm cuvinte sau
propoziții întregi decât caractere, motiv pentru care acest tip de date
există în aproape fiecare limbaj de programare. De asemenea, spunem
despre tipul string că este un tip special, deoarece are caracteristicile
unui tip primitiv, deși de fapt este un tip obiectual, fapt pe care îl
recunoaștem după numele său scris cu majusculă. Acesta este singurul
tip obiectual care poate fi tratat ca orice alt tip primitiv. Însă, datorită
caracterului său de obiect, acest tip de date are mai multe metode și
caracteristici care facilitează lucrul cu valorile de acest tip. De aceste
funcții ne vom ocupa în modulul despre tipurile de date obiectuale.
Pentru moment, ajunge să știm că o variabilă cu valoare textuală poate
fi declarată în mod identic ca și variabilele de tip primitiv, folosind
operatorul "=":

String myWord = "Hi!"


Astfel, am declarat o variabilă de tipul String și i-am atribuit valoarea
Hi!.

Ne-am familiarizat deja cu metoda de afișare a unui text la ieşire:

System.out.println("Hi!");

Obiectele

Cel mai complex tip, în toate limbajele orientate pe obiecte, este


desigur tipul obiect. Obiectul este ceva ce, deşi poate fi foarte simplu
din punct de vedere structural, poate fi şi extrem de complex şi
depinde de imaginaţia, respectiv, de necesităţile
programatorului/programului.

Povestea despre obiecte şi programarea obiectuală este "fără sfârşit"


şi în orice caz prea complexă pentru noi în acest moment. Însă,
modelul obiectual este un simbol al limbajului Java şi, vrem sau nu
vrem, nu putem învăţa limbajul Java fără a cunoaşte foarte bine acest
model.

Am spus deja că tipurile de date primitive constau doar dintr-o valoare


care le-a fost atribuită. De exemplu, dacă scriem:

int x = 10; // valoare, adică stare

Valoarea 10 reprezintă tot ce conține această variabilă x. Putem spune


că această variabilă reprezintă o condiție. În Java și în alte limbaje
obiectuale, putem defini variabile care conțin mult mai mult decât o
singură valoare numerică sau textuală. Pe lângă faptul că aceste
variabile pot conține numeroase valori, pot conține și anumite
comportamente. Astfel, putem spune că un obiect este un fenomen
mult mai complex decât tipurile primitive cu care am avut de-a face
până acum.

Pentru moment, trebuie să stăpânim cât mai bine posibil toate tipurile
de date primitive și operațiile care se pot efectua asupra lor, iar
termenul obiect îl vom explica în detaliu în capitolul despre
Programarea orientată pe obiect în Java.

Tipul Null

În Java, avem caracterul null care reprezintă o lipsă a valorii. Este o


referință care nu se referă la niciun obiect. Null este un fel de
echivalent al valorii "0" care poate fi atribuită tipurilor primitive, însă
null nu poate fi folosit decât pe obiecte.

Am vorbit deja despre Stack și Heap la începutul lecției și știm că


tipurile de referință sunt stocate în Heap, în timp ce doar referința,
adică locația de memorie a unui obiect este stocată în Stack. Când un
obiect are valoarea null (adică nu are nicio valoare) înseamnă că
variabila obiectului creat nu se referă la nicio locație din memorie.

Deoarece este posibil să separăm crearea și instanțierea unui obiect,


după cum vom vedea în lecția următoare despre variabile, în perioada
dintre aceste două operații, valoarea variabilei declarate este null.

Deoarece valoarea inexistentă sau valoarea null este carcateristică


pentru obiecte, vom vorbi mai multe despre acest subiect în modulul
despre OOP în Java.

Mai multe din cadrul acestei lecţii

Utilizarea caracterului underscore în variabilele numerice.

Java 7 introduce o noutate în privința utilizării caracterului undescore în


variabilele numerice. Underscore se poate folosi pentru a separa
grupuri de cifre în cadrul unei variabile numerice, lucru care poate
îmbunătăți lizibilitatea codului. Underscore nu va fi tratat de
traducător, așa că numărul va avea aceeași valoare ca și mai înainte.
Iată un exemplu de utilizare a caracterului underscore în variabilele
numerice:

long creditCardNumber = 1234_5678_9012_3456L;


long socialSecurityNumber = 999_99_9999L;
float pi = 3.14_15F;
long hexBytes = 0xFF_EC_DE_5E;
long hexWords = 0xCAFE_BABE;
long maxLong = 0x7fff_ffff_ffff_ffffL;
byte nybbles = 0b0010_0101;
long bytes = 0b11010010_01101001_10010100_10010010;

Caracterul underscore se poate poziționa doar între cifre. Nu se poate


plasa pe următoarele poziții:

începutul sau sfârșitul unui număr,

lângă virgulă,

înainte de sufixele F sau L.

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