Documente Academic
Documente Profesional
Documente Cultură
Elemente de limbaj
Java ca limbaj şi mediu de programare a fost lansat şi este în continuare susţinut de firma
Sun Microsystems. Cea mai mare parte a sintaxei de programare Java este moştenita de la C++, dar
unele din conceptele de programare obiectuală prezente în Java îţi au rădăcinile în limbajele
SmallTalk şi Lisp.
1
Robusteţe – elimină sursele frecvente de erori ce apar în programare prin renunţarea la
pointeri, administrarea automată a memoriei şi eliminarea pierderilor de memorie printr-o
procedură de colectare a obiectelor care nu mai sunt referite, ce rulează în fundal (”garbage
collector”).
Complet orientat pe obiecte – elimină complet stilul de programare procedural.
Securitate – este un limbaj de programare foarte sigur, furnizând mecanisme stricte de
securitate a programelor concretizate prin: verificarea dinamică a codului pentru detectarea
secvenţelor periculoase, impunerea unor reguli stricte pentru rularea proceselor la distanţă,
etc.
Neutralitate arhitecturală – comportamentul unei aplicaţii Java nu depinde de arhitectura
fizică a maşinii pe care rulează.
Portabililtate – Java este un limbaj independent de platforma de lucru, aceeaşi aplicaţie
rulând fără nici o modificare şi fără a necesita recompilarea ei pe sisteme de operare diferite
cum ar fi indows, Linux, Mac OS, Solaris, etc. lucru care aduce economii substanţiale
firmelor dezvoltatoare de aplicaţii.
Este compilat şi interpretat – aceasta fiind soluţia eficientă pentru obţinerea portabilităţii.
Performanţă – deşi mai lent decât limbajele de programare care generează executabile
native pentru o anumită platformă de lucru, compilatorul Java asigură o performanţă ridicată
a codului de octeţi, astfel încât viteza de lucru puţin mai scăzută nu va fi un impediment în
dezvoltarea de aplicaţii oricât de complexe, inclusiv grafică 3D, animaţie, etc.
Este modelat după C şi C++, trecerea de la C, C++ la Java făcându-se foarte uşor.
2
reprezentarea caracterelor 2 octeţi, ceea ce înseamnă că se pot reprezenta 65536 de semne, spre
deosebire de ASCII, unde era posibilă reprezentarea a doar 256 de caractere. Primele 256 caractere
Unicode corespund celor ASCII, referirea la celelalte făcându-se prin \uxxxx, unde xxxx reprezintă
codul caracterului.
O altă caracteristică a setului de caractere Unicode este faptul că întreg intervalul de
reprezentare a simbolurilor este divizat în subintervale numite blocuri, câteva exemple de blocuri
fiind: Basic Latin, Greek, Arabic, Gothic, Currency, Mathematical, Arrows, Musical, etc.
3.3 Literali
Literalii reprezintă valori constante de diferite tipuri de date primitive (întreg, caracter etc).
Întregi
Sunt acceptate 3 baze de numeraţie : baza 10, baza 16 (încep cu caracterele 0x) şi baza 8
(încep cu cifra 0) şi pot fi de două tipuri:
– normali - se reprezintă pe 4 octeţi (32 biţi)
– lungi - se reprezintă pe 8 octeţi (64 biţi) şi se termină cu caracterul L (sau l).
Flotanţi
Pentru ca un literal să fie considerat flotant el trebuie să aibă cel puţin o zecimală după
virgulă, să fie în notaţie exponenţială sau să aibă sufixul F sau f pentru valorile normale -
reprezentate pe 32 biţi, respectiv D sau d pentru valorile duble - reprezentate pe 64 biţi.
Exemple: 1.0, 2e2, 3f, 4D.
Logici
Sunt reprezentaţi de true - valoarea logică de adevăr, respectiv false
– valoarea logică de fals.
Caracter
Un literal de tip caracter este utilizat pentru a exprima caracterele codului Unicode.
Reprezentarea se face fie folosind o literă, fie o secvenţă escape scrisă între apostrofuri.
Secvenţele escape permit specificarea caracterelor care nu au reprezentare grafică şi
3
reprezentarea unor caractere speciale precum backslash, apostrof, etc. Secvenţele escape
predefinite în Java sunt:
– ’\b’ : Backspace (BS)
– ’\t’ : Tab orizontal (HT)
– ’\n’ : Linie nouă (LF)
– ’\f’ : Pagină nouă (FF)
– ’\r’ : Inceput de rând (CR)
– ’\"’ : Ghilimele
– ’\’’ : Apostrof
– ’\\’ : Backslash
3.4 Separatori
Un separator este un caracter care indică sfârşitul unei unităţi lexicale şi începutul alteia. In
Java separatorii sunt următorii: ( ) [ ] ; , . .
Instrucţiunile unui program se separă cu punct şi virgulă.
3.5 Identificatori
Identificatorii sunt şiruri de caractere (litere sau cifre Java) şi reprezintă numele dat unei
variabile, clase sau funcţii. Ca identificator poate fi folosit orice şir de caractere ce satisface
condiţiile:
- şirul începe cu o literă Java şi nu cu o cifră Java
- şirul este diferit de orice cuvânt cheie
- şirul este diferit de null, false, true
Nu toate caractere Unicode sunt litere sau cifre Java. Pe lângă caracterele din alfabetul latin
(majuscule de la A-Z între \u0041-\u005a, litere mici de la a-z între \u0061-\u007a şi cifrele 0-9
între \u0030-\u0039) pot fi utilizate şi alte caractere Unicode cu condiţia ca funcţia
isJavaLetter(char ch) din clasa Character returnează valoarea true.
Doi identificatori sunt identici dacă şi numai dacă conţin exact aceleaşi caractere în aceeaşi ordine.
Java deosebeşte literele mari de cele mici, deci este case sensitive.
Convenţii recomandate:
- identificatorii numelor de clasă încep cu majusculă, fiecare cuvânt distinct din identificator
începe cu majusculă;
Exemplu: ClassMan, ClassWoman;
- Identificatorii de variabilă încep cu literă mică, fiecare cuvânt ce urmează începe cu
majusculă;
Exemplu: obiectStudent1, obiectStudent2;
- identificatorii unei funcţii respectă regula de la variabile;
Exemplu: deseneazaCerc();
- identificatorii unei constante conţin doar majuscule, cuvintele fiind separate prin underscore
„_”.
Exemplu: NUMAR_MAXIM.
Exemple:
final double PI = 3.14;
final int MINIM=0, MAXIM = 10;
int valoare = 100;
char c1=’j’, c2=’a’, c3=’v’, c4=’a’;
long numarElemente = 12345678L;
String bauturaMeaPreferata = "apa";
4
3.6 Comentarii
Programarea nu înseamnă doar exprimarea corectă a unui algoritm într-un anumit limbaj de
programare ci şi exprimarea gândurilor într-o formă inteligibilă. Asta se poate realiza printr-o
alegere adecvată a denumirilor folosite pentru clase, metode şi variabile. Pentru cazuri în care
aceasta nu este suficient, trebuie să existe posibilitatea de a lasă în codul sursă un text explicativ
care să documenteze alegerile făcute de programator la momentul elaborării algoritmului.
Informaţiile astfel păstrate îşi pot demonstra utilitatea în cazul modificaţii sau reutilizării codului de
către o altă persoana sau chiar şi de programatorul însuşi. Ca urmare, comentariile oferă
posibilitatea documentării programului în vederea unei mai uşoare înţelegeri.
3.7 Operatori
atribuirea: =
operatori matematici: +, -, *, /, %, --, ++
Este permisa notaţia prescurtata de forma lval op= rval (ex: n += 2)
Exista operatorii pentru autoincrementare şi autodecrementare (post şi pre)
ex: x++, ++x, n--, --n
operatori logici: &&(and), ||(or), !(not)
operatori relaţionali: <, <=, >, <=, ==, !=
operatori pe biţi: & (and), |(or), ^(xor), ~(not)
operatori de translaţie <<, >>, >>> (shift la dreapta fara semn)
Operanzii trebuie să fie de un tip întreg, în general int sau long.
Operatorul << deplasează spre stânga şi biţi de 0 sunt introduşi pe poziţiile cele mai
puţin semnificative. Deplasarea spre stânga cu o poziţie corespunde dublării
operandul stâng, deplasarea spre stânga cu mai mult de o poziţie corespunde
înmulţirii operandului stâng cu 2,4,8,16, ş.a.m.d.
Operatorul >> efectuează o deplasare cu semn (sau aritmetică) spre dreapta.
Rezultatul are biţi de 0 pe cele mai semnificative poziţii dacă operandul stâng este
pozitiv, şi biţi de 1 pe cele mai semnificative poziţii dacă operandul stâng este
negativ. Rezultatul aproximează împărţirea operandului stâng la 2 ridicat la puterea
operandului drept.
Operatorul >>> efectuează o deplasare fără semn (sau logică) spre dreapta.
Rezultatul are biţi de 0 pe cele mai semnificative poziţii şi poate să nu reprezinte
întotdeauna o divizare a operandului stâng.
operatorul if-else: expresie_logica ? val_pt_true : val_pt_false ;
operatorul , (virgula) folosit pentru evaluarea secvenţiala a operaţiilor int x=0, y=1, z=2;
operatorul + pentru concatenarea şirurilor:
5
String s="abcd"
int x=100;
System.out.println(s + " - " + x);
operatori pentru conversii (cast) : (tip_de_data)
int i = 200;
long l = (long)i; //widening conversion - conversie prin extensie
long l2 = (long)200;
int i2 = (int)l2; //narrowing conversion - conversie prin contracţie
operatorul instanceof testează dacă un obiect este de o anumită clasă
boolean test;
Class1 obj1;
Class2 obj2;
test=obj2 instanceof Class1 //test va fi false
4. Tipuri de date
Tipurile de date din Java se clasifica în doua categorii:
a. Tipuri de date primitive – reprezintă acele date care sunt incluse implicit în limbajul Java.
Sunt tipuri numerice întregi (byte, short, int, long, char), tipuri numerice reale (float, double)
şi tipul boolean (boolean).
6
Variabilele de tip referinţă se pot crea cu operatorul new care (spre deosebire de C++)
returneaza o referinţă.
O referinţă Java este un identificator al unui obiect şi este, de fapt un pointer ascuns,
asemănător cu o referinţă C++, de care se deosebeşte în primul rând din punct de vedere sintactic
(nu se mai foloseşte operatorul & la definiţia unei referinţe).
Deoarece nu se pot defini referinţe pentru tipurile primitive, în pachetul java.lang sunt
definite mai multe clase care “înfăşoară” tipurile primitive, adică au ca data membru o variabila de
tipul primitiv respectiv. Aceste clase sunt Byte, Short, Integer, Character, Float, Double
etc. Majoritatea acestor clase (cu excepţia claselor Integer şi Character) au aceeaşi denumire ca şi
tipul de date primitive corespunzător, cu primul caracter modificat în majusculă.
class Numar{
int n;
Numar(int x){n=x;}
}
public class Tipuri{
public static void main(String[] args) {
int x = 10;
Integer i1 = new Integer(100);
Byte b1 = new Byte((byte)20);
Character c1 = new Character('A');
Numar n1 = new Numar(7);
System.out.println("int: " + x);
System.out.println("Integer: " + i1);
System.out.println("Byte: " + b1);
System.out.println("Character: " + c1);
System.out.println("Numar: " + n1.n);
}
}
Output:
int: 10
Integer: 100
Byte: 20
Character: A
Numar: 7
5. Variabile
Variabilele pot fi de tip primitiv sau referinţă. Indiferent de tipul lor, pentru a putea fi
folosite variabilele trebuie declarate şi, eventual, iniţializate.
Declararea variabilelor: Tip numeVariabila;
Iniţializarea variabilelor: Tip numeVariabila = valoare;
Declararea constantelor: final Tip numeVariabila;
Există posibilitatea de a declara şi iniţializa mai multe variabile sau constante de acelaşi tip într-o
singură instrucţiune astfel:
7
Variabilele declarate într-un for, rămân locale corpului ciclului:
int x=1;
{
int x=2; //incorect
}
6. Controlul execuţiei
6.1 Instrucţiuni de decizie
if-else
if (expresie-logica) {
...
}
if (expresie-logica) {
...
} else {
...
}
switch-case
switch (variabila) {
case valoare1:
...
break;
case valoare2:
...
break;
...
default:
...
}
for
foreach
Este o variantă de for specializat pe parcurgerea secvenţială de vectori fără a folosi o variabilă de
index. Se poate citi ca „pentru fiecare element execută”. Variabila element trebuie să fie de acelaşi
tip ca vectorul.
8
for (Tip_element element: nume_vector) {
// procesare element
}
Atât la iniţializare cât şi în pasul de iteraţie pot fi mai multe instrucţiuni despărţite prin virgulă.
while
while (expresie-logica) {
...
}
do-while
do {
...
}
while (expresie-logica);
Deşi în Java nu există goto, se pot defini totuşi etichete folosite în expresii de genul:
break numeEticheata
sau
continue numeEticheta,
utile pentru a controla punctul de ieşire dintr-o structură repetitivă.
i=0;
eticheta:
while (i < 10) {
System.out.println("i="+i);
j=0;
while (j < 10) {
j++;
if (j==5) continue eticheta;
if (j==7) break eticheta;
System.out.println("j="+j);
}
i++;
}
7. Vectori
Un vector este folosit pentru a stoca o colecţie de date, sau altfel spus, o colecţie de variabile
de acelaşi tip. În loc de a declara variabile individuale numarul1, numarul2, până la numarul1000,
declaram un vector numit numere de dimensiune 1000 şi referim elementele prin numere[1],
numere[2], până la numere[1000].
Elementele dintr-un vector trebuie sa fie de acelaşi tip, care poate fi primitiv sau referinţă.
Tablourile de date primitive conţin chiar acele date memorate în elementele tabloului,
9
Vectorii de date primitive conţin în elementele lor valorile efective ale datelor primitive.
Vectorii de referinţe conţin în elementele lor, adrese de memorie (referinţe) spre zonele de memorie
unde se află obiectele stocate.
Identificatorul oricărui vector reprezintă o referinţă la locaţia de memorie unde se găseşte
întregul set de elemente.
În Java, orice vector este un obiect care conţine, în afara elementelor de tabloului, şi un
atribut public (variabilă membru) numit length. Aceasta reţine dimensiunea vectorului şi poate fi
doar citit nu şi scris.
Ex:
int[] lista; // Declarare de vector cu elemente întregi.
String[] adrese; // Declarare vector cu elemente de tip referinţă.
După declararea unui vector se creează o variabilă referinţă de valoare null, adică nu referă nici o
zonă de memorie. Aşadar, la declararea unui vector nu se aloca spaţiu pentru elementele tabloului,
indiferent de dimensiune. Se creează doar un spaţiu de stocare pentru o referinţă la un vector.
b) Instanţierea
Spre deosebire de declararea variabilelor de tip primitiv, declararea unui vector nu implică
alocă de spaţiul de memorie.
După declararea unui vector, acesta poate fi creat prin utilizarea operatorului new şi
specificarea numărului maxim de elemente pe care îl va avea vectorul (adică dimensiunea). Ca
sintaxă avem:
Ex:
lista = new int[1000]; // Se aloca spaţiu pentru 1000 de întregi.
adrese = new String[100]; // Se aloca spaţiu pentru 10 obiecte de
// tip String.
La instanţiere au loc două lucruri: în primul rând, se creează un vector nou cu operatorul
new, şi în al doilea rând, se asociază unei variabile, referinţa spre zone de memorie nou creată.
Întrucât alocarea memorie se face exclusiv prin operatorul new, următoarea abordare este
incorectă.
10
Ex:
int v[5]; //incorect
int[] v = new int[5]; //corect
c) Iniţializarea
Prin iniţializare asociem elementelor din vector valori iniţiale concrete. Ea este opţională şi poate fi
făcută imediat după declararea unui vector. Alocarea memoriei se face automat în funcţie de
numărul de elemente cu care se iniţializează vectorul. Ca sintaxă avem:
Ex:
String[] culori = {"Rosu", "Galben", "Verde"};
int[] numere = {9, 4, 2, 302, 5, 7};
Daca valoarea indexului nu este pozitiva sau depăşeşte dimensiunea vectorului, în cursul
execuţiei se va “arunca” o excepţie java.lang.ArrayIndexOutOfBoundsException.
Valorile implicite pentru vectorii de date primitive sunt: 0 la tipuri numerice, \u0000 la tipul
char şi false la tipul boolean. În cazul vectorilor de tip referinţă, elementele sunt implicit
iniţializate cu valoarea null.
În Java vectorii sunt indexaţi după valori numerice întregi pozitive începând cu 0, pentru
primul element, şi până la lungimea vectorului – 1, pentru ultimul element.
Accesarea elementelor din vector se face prin operatorul de indexare [ ] . Exemple:
int[] numere = {9, 4, 2, 302, 5, 7};
int x = numere[2];
numere[2]= numere[1]+ numere[4];
11
La instanţierea vectorilor cu elemente de tip referinţă, adică obiecte, nu este suficientă
simpla alocarea a spaţiului de memorie necesar vectorului, trebuie de asemenea instanţiat şi fiecare
obiect din vector.
Ex.
Integer[] anArray = new Integer[3];
12
int x[] = {1, 2, 3, 4};
int y[] = new int[4];
System.arraycopy(x,0,y,0,x.length);
fill(tip[], val), pentru umplerea unui tablou de date de tipul tip cu valoarea val (de
acelaşi tip dat). Exista mai multe versiuni supraîncarcate, pentru tipuri primitive si pentru
referinţe (la clasa de baza Object): fill(int[] a, int v), fill(Object[] a,
Objectv).
equals(tip[] a, tip[] v), returneaza true daca cele doua tablouri (de date de acelaşi
tip) au toate elementele egale.
sort(tip[] a) , sortează elementele vectorului a (care conţine elemente de tipul tip).
În următorul exemplul se creează câteva tablouri de diferite tipuri (boolean, int etc.) care se
iniţializează folosind metoda fill() a clasei Arrays şi se listează. Pentru listarea elementelor
s-au scris câteva metode de conversie supraîncarcate pentru tablouri de elemente de diferite tipuri.
import java.util.*;
class Numar{
int n;
public Numar(int k){ n = k; }
public String toString(){ return "n = " + n;}
}
13
for(int i = 0; i < a.length; i++) {
result.append(a[i]);
if(i < a.length - 1)
result.append(", ");
}
result.append("]");
return result.toString();
}
public static String toString(int[] a) {
StringBuffer result = new StringBuffer("[");
for(int i = 0; i < a.length; i++) {
result.append(a[i]);
if(i < a.length - 1)
result.append(", ");
}
result.append("]");
return result.toString();
}
public static String toString(Numar[] a){
StringBuffer result = new StringBuffer("[");
for(int i = 0; i < a.length; i++) {
result.append(a[i]);
if(i < a.length - 1)
result.append(", ");
}
result.append("]");
return result.toString();
}
14
Pachete de bază
java.lang Conţine clase fundamentale pentru Java (ex. Math) şi sunt
disponibile automat in program. Ele nu trebuie importate.
java.io Conţine clase care suportă operaţii de input/output pe fluxuri.
java.nio Conţine clase care suportă noile operaţii de input/output introduse
in JDK1.4 (în special cu fişiere).
java.nio.channels Conţine clase care suportă operaţii de input/output (cele care scriu
şi citesc fişiere)
java.awt Conţine clase care suportă interfaţa grafică java (GUI).
javax.swing Conţine clase care suportă componentele grafice „Swing”. Acestea
nu sunt doar mai flexibile şi uşor de utilizat decât echivalentul
java.awt, ele sunt implementate cu o dependenţă minimală de cod
nativ.
javax.swing.border Clase care suportă generarea de contururi în jurul componentelor
Swing.
javax.swing.event Clase care suportă tratarea de evenimente pentru componentele
Swing.
java.awt.event Clase care suportă tratarea de evenimente.
java.awt.geom Conţine clase pentru desenarea şi lucrul cu entităţi geometrice 2D.
java.applet Conţine clase care permit scrierea de applet-uri (programe integrate
în pagini web).
java.util Conţine clase care suportă o gamă de operaţii standard pentru
managementul colecţiilor de date, accesarea informaţiilor de dată şi
timp, şi analiza şirurilor.
15