Sunteți pe pagina 1din 39

Limbajul Java

1. Generaliti
1.1.

Istoric

Limbajul Java a fost creat n cadrul firmei Sun Microsystems de o echip condus de James Gosling.
Prima versiune a limbajului a fost lansat n 1995.
n 2010 compania Sun Microsystems a fost preluat de Oracle Co., dezvoltarea limbajului
continund n cadrul noii societi.
n timp limbajul a evoluat i au fost lansate noi versiuni. Versiunea curent este cunoscut sub
numele de Java 1.8 sau Java 8.

1.2.

Java Virtual Machine

Dac n cazul limbajelor uzuale (C, C++ etc.) prin compilare se obin fiiere coninnd instruciuni
n cod main (cod adaptat unei familii de microprocesoare), compilatorul Java produce un cod
independent de un procesor anume. Codul produs de compilatorul Java este denumit bytecode sau cod
de octei i pentru executarea lui este necesar un procesor care poate executa codul. Alternativa la un
astfel de procesor este procesorul virtual Java (Java virtual machine, prescurtat JVM) care este o
implementare software a procesorului necesar executrii codului de octei.
Procesoare virtuale Java exist pentru toate sistemele de operare majore.

1.3.

Java Runtime Environment i Java Development Kit

Instrumentele necesare tratrii codului scris n Java se prezint n dou forme, respectiv JRE
(Java Runtime Environment) i JDK (Java Development Kit).
JRE conine JVM i bibliotecile de clase necesare executrii aplicaiilor Java.
n JDK, pe lng componentele coninute n JRE sunt incluse instrumentele necesare dezvoltrii
de aplicaii Java, cel mai important fiind compilatorul Java.

1.4.

Caracteristicile limbajului Java

Independent de platform: Creatorii limbajului au realizat un limbaj care permite


crearea i compilarea codului pe un calculator i executarea lui pe orice calculator,
indiferent de sistemul de operare al acestuia.

Orientat pe obiecte: n Java, cu excepia variabilelor aparinnd tipurilor elementare


(int, char, float, double, etc.) toate variabilele vor fi obiecte.

1.5.

Puternic tipizat: Tipurile variabilelor trebuie declarate i, cu mici excepii, nu se


realizeaz conversii automate dintr-un tip n altul. Conversiile trebuie impuse explicit,
prin program.

Codul surs Java este compilat i interpretat: Compilarea se realizeaz folosind


compilatorul inclus n JDK i interpretarea codului de octei se realizeaz n JVM, care
este n esen un interpretor.

Sintaxa limbajului Java este similar celei utilizate n limbajul C++.

Procesul de programare

Programarea n Java se realizeaz folosind medii integrate de dezvoltare, cele mai utilizate fiind
Netbeans i Eclipse. Dup scrierea codului, mediul de programare va apela compilatorul Java i va crea
pentru fiecare clas a aplicaiei cte un fiier .class coninnd codul de octei executabil n procesorul
virtual Java (JVM).
Mediul de programare poate oferi i alte funcii: formatarea codului, crearea automat a unor
secvene de cod, evidenierea erorilor de sintax etc.

1.6.

Classpath

Calea spre clasele aplicaiei (fiiere compilate .class) este pstrat sub forma unui ir de
caractere denumit classpath. irul este ntreinut folosind facilitile oferite de mediul de programare.
Procesorul virtual Java integreaz n aplicaie clasele specificate n classpath.

2. Instalarea JDK
2.1.

Instalarea

JDK (Java Development Kit) este un ansamblu de instrumente software destinat dezvoltrii de
aplicaii n Java oferit de firma Oracle Corporation. Pachetul poate fi descrcat de pe site-ul firmei:
(http://www.oracle.com/technetwork/java/javase/downloads/index.html).
Observaie: n Linux Ubuntu JDK (versiunea 7 deocamdat) poate fi instalat folosind comanda:
sudo apt-get install openjdk-7-jdk

2.2.

Verificarea instalrii

Pentru a verifica dac instalarea s-a realizat corect se deschide o consol (n Windows: All
Programs / Accessories / Command Prompt) i se tasteaz comanda:
java -version

Dac pocesorul Java este instalat, n fereastr vor aprea informaii legate de versiunea
acestuia.

3. Noiuni fundamentale
3.1.

Class, object i package

class

O clas (class) este o colecie de variabile i funcii care implementeaz caracteristicile i


comportamentul unei instane aparinnd clasei respective.
n Java o clas este declarat folosind cuvntul class. Se recomand ca numele clasei s nceap
cu o liter mare. Corpul clasei este ncadrat ntre acolade ({}).
public class PrimaClasa {
. . .
}

Caracteristicile unei instane a clasei (a unui obiect) sunt memorate n variabilele clasei.
Comportamentul instanelor clasei este implementat prin metodele clasei (funcii Java).
Codul surs al unei clase este memorat pe disc ntr-un fiier separat avnd numele clasei i
extensia .java.

object

Un obiect (eng. object) este o instan a unei clase. O clas poate fi instaniat printr-un numr
oarecare de obiecte.
De multe ori obiectele sunt reprezentri software ale obiectelor din lumea real. Ele pot evolua
sau realiza aciuni prin apelul metodelor clasei. Exemplu:

Cerc c1 = new Cerc(20,10,32);


Cerc c2 = new Cerc(12, 0, 21);
. . .
c1.translatez(12.3, 30.);
...

package

Java permite gruparea claselor n entiti denumite pachete (eng. packages). n cazul aplicaiilor
de mari dimensiuni, realizate de mai muli programatori, gruparea permite realizarea n cadrul aplicaiei
a unor uniti logice. De exemplu clasele care sunt legate de realizarea interfeei unei aplicaii pot fi
grupate n acelai pachet.
3

Alt raiune pentru gruparea claselor n pachete este evitarea coliziunilor de nume. O astfel de
coliziune se produce cnd doi programatori folosesc acelai nume pentru dou clase distincte. Dac
fiecare programator va pstra clasele n propriul pachet, coliziunea va fi evitat scriind numele clasei n
varianta complet (fully qualified), respectiv nume_pachet.nume_clas. Exemplu: interf.linie.
package aplicatie1;
public class PrimaClasa {
. . .
}

3.2.

Motenirea

O clas poate fi derivat din alt clas, devenind astfel o subclas sau clas derivat. Clasa din
care s-a realizat derivarea se numete clas printe, clas de baz sau superclas (superclass) a clasei
derivate.
Motenirea permite ca o clas derivat s moteneasc variabilele i metodele clasei de baz.
n Java o clas poate avea o singur clas printe.
Exemplu:
package aplicatie2;
public class ClasaDeBaza {
void salut(){
System.out.println("Salut din ClasaDeBaza! ");
}
}

package aplicatie2;
public class ClasaDerivata extends ClasaDeBaza {
. . .
}

Motenirea este caracteristica exploatat pentru corectarea, ameliorarea i specializarea


claselor. n clasa derivat componentelor motenite li se pot aduga altele noi iar metodele care trebuie
s funcioneze altfel pot fi suprascrise.

3.3.

Suprascrierea metodelor i meniunea @override

Dac n clasa derivat o metod trebuie schimbat ea poate fi rescris pstrndu-se semntura
metodei din clasa de baz (nume, tip, parametri). Pentru a indica supracrierea unei metode, naintea
liniei de definire a acesteia se va aduga notaia @override.
Exemplu:
package aplicatie2;
public class ClasaDeBaza {
void salut(){
System.out.println("Salut din clasa de baza!");
}
}

package aplicatie2;
public class ClasaDeriv extends ClasaDeBaza {
@override
void salut(){
System.out.println("Salut din clasa derivata!");
}
}

3.4.

Superclasa tuturor claselor

n Java, la baza oricrei ierarhii de clase se afl clasa Object. Metodele clasei Object
(motenite de toate clasele!), sunt:
equals(o1) permite compararea obiectelor;
getClass() returneaz clasa creia i aparine obiectul;
hashCode() returneaz un identificator al obiectului curent
toString() returneaz o reprezentare ca ir de caractere a obiectului curent.

4. Variabile i metode
4.1.

Variable

n orice limbaj, variabilele sunt folosite pentru memorarea unor valori n timpul execuiei
programului.

n Java o variabil poate conine o valoare aparinnd unui tip de baz (byte, short, int, long,
float, double, char, boolean) sau poate fi o referin spre un obiect (poate memora adresa unui obiect).
Compararea folosind operatorul '==' funcioneaz doar cu tipuri de baz, compararea a dou obiecte (de
fapt referine spre dou obiecte) va verifica dac referinele indic aceeai adres din memorie.
Compararea
corect
a
obiectelor
se
realizeaz
folosind
metoda
equals():
obiect1.equals(obiect2). Exemplu:

package aplicatie3;

public class Demo {


private int i, j;
private String s;
public Demo(int i, int j, String s) {
this.i = i;
this.j = j;
this.s = s;
}
void compar() {
boolean c1, c2;
c2 = (s.equals("Jerry"));
c1 = (i == j);
System.out.println("i = j? " + c1);
System.out.println("Dar s = Jerry? " + c2);
}
public static void main(String[] args) {
Demo a = new Demo(1, 72, "Thomas");
a.compar();
}
}

Rezultate:

4.2.

Variabilele clasei

Prin variabilele clasei, denumite i variabilele instanei sau parametri, se definesc proprietile
viitoarelor instane ale acesteia. Variabilele clasei pot aparine unui tip de baz (byte, short, int, long,
6

float, double, char, boolean) sau pot fi obiecte (variabila s din exemplul precedent este un obiect din
clasa String).
Variabilele instanei sunt de obicei declarate private, ceea ce nseamn c sunt accesibile doar
din metodele clasei. Ele pot fi de asemenea declarate final, ceea ce nseamn c odat iniializate,
valoarea primit nu mai poate fi schimbat.

4.3.

Variabile locale

Variabilele locale sunt declarate n interiorul metodelor. Variabilele locale trebuie iniializate
naintea utilizrii.

4.4.

Metode

n programarea orientat pe obiecte, metoda (eng. method) este practic sinonima funciei din
programarea neobiectual. n consecin o metod este un bloc de cod care primete valori prin
intermediul unei liste de parametri i returneaz o valoare. O metod este apelat pentru un obiect prin
expresia ob.metoda() sau, n cazul metodelor statice, prin expresia clasa.metoda(). O metod
apelat pentru o instan opereaz asupra valorilor variabilelor instanei.

package exemplul3;
public class ExempluMetoda {
private String nume;
void setNume(String s) {
this.nume = s;
}
. . .
}

Lista de parametri ai unei metode poate fi vid.


Tip_param nume.

Parametrii din list respect sintaxa

O metod poate suprascrie o metod din clasa de baz. n acest caz va prelua numele metodei
din clasa de baz, lista de parametri i tipul valorii returnate.

4.5.

Metoda principal, main()

Execuia unei aplicaii Java ncepe cu prima instruciune executabil a unei metode avnd
numele main() i declaraia:
public static void main(String[] args){
. . .
}

4.6.

Constructori

O clas conine unul sau mai muli constructori. Un constructor este o metod apelat pentru a
crea instane ale clasei (obiecte).
Declaraia unui constructor seamn cu declaraia unei metode oarecare a clasei, diferena fiind
faptul c numele constructorului coincide cu numele clasei i nu este precizat tipul returnat.
O clas poate avea unul sau mai muli constructori, diferii prin parametrii de intrare (tipul i
numsul acestora).
n exemplul considerat n continuare clasa Punct2D are un constructor cu doi parametri.
package exemplul4;
public class Punct2D {
private int X, Y;
public Punct2D(int x, int y) {
this.X = x;
this.Y = y;
}
public void setX(int v) {
this.X = v;
}
public void setY(int y) {
this.Y = y;
}
public void translatez(int dx, int dy) {
x += dx;
Y += dy;
}
}

Dac pentru o clas nu este definit niciun constructor, compilatorul i adaug un constructor
implicit. Dac o clas fr constructor explicit este derivat dintr-o alt clas, constructorul superclasei
este apelat automat.
Fiecare obiect este creat prin apelul unui constructor. Numai dup apelul constructorului
obiectul devine utilizabil. Apelul constructorului se realizeaz folosind operatorul new, ca n exemplul
urmtor.

Punct2D p1;
Punct2D p2;
...
p1 = new Punct2D(120, 16);

p2 = new Punct2D(135, 16);


p1.translatez(21, 230);
...

5. Modificatori
5.1.

Modificatori de acces

n Java exist trei modificatori de acces: public, protected i private.


Modificatorii de acces impun modul n care componentele afectate de acetia sunt accesibile din
diferite clase ale aplicaiei.

5.2.

public: O component declarat public (variabil a clasei sau metod) este


accesibil din orice clas a aplicaiei i poate fi apelat pentru orice instan a clasei. De
obicei metodele clasei sunt declarate public.

private: Dac o component este declarat private, ea rmne accesibil


metodelor clasei dar inaccesibil din alte clase. De regul sunt declarate private
variabilele clasei. Pentru a accesa un parametru declarat private dintr-o alt clas,
pentru acel parametru vor fi definite o pereche de funcii (set i get). Mediile de
programare permit adugarea automat a acestora.

protected: O component a clasei declarat protected poate fi accesat din oricare


clas a pachetului curent i din clasele derivate aflate n alte pachete.

Ali modificatori

final: Metodele astfel declarate nu pot fi suprascrise n clasele derivate;

abstract: Metodelor declarate abstracte le lipsete corpul. O clas avnd astfel de


metode este o clas abstract i nu poate fi instaniat. Ea este declarat cu scopul de a
crea o clas de baz pentru alte clase.

6. Comenzile import
6.1.

Utilizarea comenzilor import

Pentru a accesa n Java o clas care nu aparine pachetului curent trebuie folosit numele
complet al acesteia, construcia sintactic utilizat fiind pachet.nume_clas.
Dac se adaug ns la nceputul fiierului clasei comenzi import care definesc pachetele sau
clasele folosite, n cadrul clasei se vor putea folosi denumirile claselor din respectivele pachete fr a fi

nsoite de numele pachetelor din care fac parte. Pachetul java.lang este implicit, pentru el nu
trebuie adugat o comand import.

7. Alte aspecte ale limbajului Java


7.1.

Interfaa

Interfaa (eng. Interface) aeste o construcie sintactic similar clasei. Ea definete un numr de
metode. Metodele unei interfee sunt implicit abstracte i publice.
O clas poate implementa o interfa, caz n care va conine un set complet de metode
ne-abstracte care suprascriu metodele abstracte ale interfeei. Din acest punct de vedere, o interfa
stabilete ce face clasa derivat, fr a spune, desigur, i cum va face.
Interfeele pot avea constante care sunt i ele implicit publice, statice i finale.
n clasa care implementeaz o interfa metodele suprascrise vor fi precedate de @override .
O clas poate implementa mai multe interfee simultan.
Exemplu: Pentru gestionarea activitii mouse-ului, n Java sunt definite dou interfee,
MouseListener i MouseMotionListener. n exemplul urmtor s-a exemplificat implementarea interfeei
MouseListener. Exemplul a fost preluat din documentaia online a limbajului Java. n cadrul clasei s-au
evideniat metodele interfeei MouseListener. Toate metodele interfeei a trebuit s fie implementate,
dei numai corpul metodei mouseClicked() realizeaz o aciune (conine cod).

package events;
public class MouseDemo ... implements MouseListener {

...//where initialization occurs:


//Register for mouse events on blankArea and panel.
blankArea.addMouseListener(this);
addMouseListener(this);
...
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mouseClicked(MouseEvent e) {
saySomething("Mouse button click", e);
}
void saySomething(String eventDescription, MouseEvent e) {
textArea.append(eventDescription + " detected on "
+ e.getComponent().getClass().getName()
+ ".\n");

10

textArea.setCaretPosition(maxInt); //scroll to bottom


}
}

7.2.

Componente statice (static)

O clas poate avea metode i proprieti care aparin clasei i nu sunt legate de instanele clasei
(de obiectele aparinnd clasei). Aceste componente sunt declarate statice (static) i sunt referite
prin expresia nume_clasa.componenta. Exemplu fundamental: Math.sin(x). Metoda
sin(x) aparine clasei Math. i a fost declarat static.
Un exemplu de variabil static
System.out.println("Salut!");

unei

clase

Java

este

out

din

expresia

Aici out este un obiect din clasa PrintStream. El este membru static al clasei System, de
aceea este referit scriind System.out. Metoda println() este apelat pentru acest obiect, ceea
ce ne conduce la cunoscuta expresie folosit la scrierea pe consol: System.out.println().
Un exemplu de metod static este main(). n aplicaii ea va fi declarat ntotdeauna scriind:
public static void main(String[] arg) {
System.out.println("Mesaj afisat la pornire");
}

O metod static nu acceseaz coninut ne-static, fiind independent de instanele clasei n care
apare. De exemplu metoda sin(x) din clasa Math nu acceseaz valori ale cmpurilor unui obiect
anume ci returneaz valoarea funciei sinus pentru o valoare x transmis prin argument. n acelai timp
metoda translatez() apelat astfel: p7.translatez(123,-17);, nu poate fi static
deoarece ea modific valorile coordonatelor X i Y ale unui punct p7, deci este apelat pentru obiectul
p7 i nu independent de obiectele clasei.

7.3.

Clase abstracte

O clas poate fi declarat abstract (eng. abstract). O clas abstract are cel puin o metod
declarat abstract i nu poate fi instaniat. Ea va servi drept clas de baz pentru clase derivate.
Clasele derivate dintr-o clas abstract vor implementa metodele abstracte ale clasei de baz.
Metodelor abstracte le lipsete corpul.
Exemplu:

package exemplu;
public abstract class CalculeGeom {
abstract double calculArie();
abstract double calculVol();

11

8. Clase anonime
O clas anonim este o clas care implementeaz o interfa sau este derivat dintr-o clas
abstract i este folosit la construirea unui singur obiect. Exemplu:

public class HelloWorldAnonymousClasses {


interface HelloWorld {
public void greet();
public void greetSomeone(String someone);
}
public void sayHello() {
class EnglishGreeting implements HelloWorld {
String name = "world";
public void greet() {
greetSomeone("world");
}
public void greetSomeone(String someone) {
name = someone;
System.out.println("Hello " + name);
}
}
HelloWorld englishGreeting = new EnglishGreeting();
HelloWorld frenchGreeting = new HelloWorld() {
String name = "tout le monde";
public void greet() {
greetSomeone("tout le monde");
}
public void greetSomeone(String someone) {
name = someone;
System.out.println("Salut " + name);
}
};
HelloWorld spanishGreeting = new HelloWorld() {
String name = "mundo";
public void greet() {
greetSomeone("mundo");
}
public void greetSomeone(String someone) {
name = someone;

12

clase anonime care


implementeaz
interfaa HelloWorld

System.out.println("Hola, " + name);


}
};
englishGreeting.greet();
frenchGreeting.greetSomeone("Fred");
spanishGreeting.greet();
}
public static void main(String... args) {
HelloWorldAnonymousClasses myApp =
new HelloWorldAnonymousClasses();
myApp.sayHello();
}
}

9. Structuri POO clasice


n continuare vor fi prezentate un numr de soluii specifice POO (programare orientat pe
obiecte). Acestea pot fi considerate ca referine n rezolvarea problemelor de construire a unei aplicaii
Java.

9.1.

Deci cteva reete...

Ce se vrea...

i cum se scrie:

Crearea unei clase noi denumita Testare.


package test;
public class Testare {
. . .
}

Adugarea ca membru al clasei a parametrului


nume din clasa String.

Crearea unui constructor pentru clasa Testare


care d valoare parametrului nume.

package test;
public class Testare {
private String nume;
}

package test;
public class Testare {
private String nume;
public Testare(String nm) {
nume = mn;

13

Ce se vrea...

i cum se scrie:
// sau this.nume = nm;
}
}

Crearea unei metode denumita faCeva() n


clasa Testare care nu returneaz nimic i nu
are parametri. Avnd acces la variabilele
instanei, o astfel de metod opereaz asupra
acestora.

package test;
public class Testare {
private String nume;
public Testare(String nm) {
nume = mn;

// sau thisnume= nm;


}
public void faCeva() {
. . .
}
}

Adugarea unei metode denumita


faCu2Param() n clasa Testare care nu
returneaz nimic i are parametri, unul int i
un obiect din clasa Persoana .

package test;
public class Testare {
private String nume;
public Testare(String nm) {
nume = mn;

// sau thisnume= nm;


}
public void faCeva() {
. . .
}
public void faCu2Param(int a,
Persoana pers) {
. . .
}
}

Adugarea metodei faCu3Param() care


returneaz o valoare int i are trei parametri,
dou iruri de caractere (String) i un obiect
din clasa Persoana.

package test;
public class Testare {
private String nume;
public Testare(String nm) {
nume = mn; // sau thisnume= nm;
}

14

Ce se vrea...

i cum se scrie:
public void faCeva() {
. . .
}
public void faCu2Param(int a,
Persoana pers) {
. . .

}
public int faCu3Param(String a, String b,
Persoana pers) {
. . .

return 5; // O valoare intreaga


}
}
Crearea unei clase denumit ClasaADoua
avnd dou variabile ale instanei (parametri):
un ir de caractere (String) i un obiect din
clasa Caine. Clasei i se va aduga un
constructor i metode set i get pentru a
asigura accesul la cele dou variabile.

package test;
public class ClasaADoua {
String adresa;
Caine ham;
public ClasaADoua () {
this.adresa = adresa;
this.ham = ham;
}
public String getAdresa() {
return adresa;
}
public void setAdresa(String adresa)
{
this.adresa = adresa;
}
public Caine getHam() {
return ham;
}
public void setHam(Caine ham) {
this.ham = ham;
}
}

i n final, structura clasic a unei aplicaii Java:


// Fisierul principal, MemoCarti.java
package aplicarti;

15

Ce se vrea...

i cum se scrie:

public class MemoCarti {


// Constructorul clasei MemoCarti
public MemoCarti() {
Carte prima = new Carte("Horton Hears
A Who!","Dr. Seuss","Random House");
Carte cdoi = new Carte("Toate panzele
sus!","Radu Tudoran","Cartea Romaneasca");
Carte ctrei = new Carte("Aventurile
lui Sherlock Holmes","Agatha
Christie","Dacia");
prima.afisezCartea();
cdoi.afisezCartea();
ctrei. afisezCartea();
}
//
//

Fisierul principal
contine metoda main()
public static void main(String[] args)

{
MemoCarti m = new MemoCarti();
}
}

// Fisierul Carte.java
package aplicarti;
// Clasa Carte
public class Carte {
//fields
private String titlu;
private String autor;
private String editor;
//Constructorul clasei Carte
public Carte(String titlu, String aut,
String edit)
{
//populate the fields
this.titlu = titlu;
this.autor = aut;
this.editor = edit;
}
public void afisezCartea()
{
System.out.println("Titlu: " +

16

Ce se vrea...

i cum se scrie:
titlu);
System.out.println("Autor: " +
autor);
System.out.println("Editor: " +
editor);
}
}

9.2.

Utilizarea variabilelor locale

O variabil local se declar n interiorul unei metode.


Ce se vrea...

i cum se scrie:

Declararea unei variabile locale de tip String.

String nume1;

Declararea unei variabile locale de tip String i atribuirea


unei valori.

String mesaj2 = "Apasati ESC!";

Declararea unei variabile locale din clasa Persoana

Persoana pers;

Declararea unei variabile locale de tip Persoana i


iniializarea ei cu un obiect din clasa Persoana (creat folosind
operatorul new).

Persoana pers2 = new Persoana();

Declararea unui ir de valori de tip String

String sir1[];

Declararea unui ir de valori de tip String i crearea unui ir


putnd memora 7 obiecte Persoana.

Persoana sir2[]= new Persoana[7];

Atribuirea unei valori unei variabile ntregi (declarate n


prealabil).

contor = 12;

Atribuirea unei variabile de tip Persoana a unei valori

pers = pers2;

17

Ce se vrea...

i cum se scrie:

existente deja.
Declararea unei variabile de tip ArrayList putnd memora
un ansamblu de obiecte de tip Persoana ntr-o structur de
tip list.

ArrayList<Persoana> personal;

Crearea unui obiect de tip ArrayList cu obiecte de tip


Persoana i atribuirea lui variabilei declarate personal.

personal = new
ArrayList<Persoana>();

Declararea unei variabile de tip ArrayList putnd memora


obiecte din clasa Persoana, crearea i atribuirea unui obiect.

ArrayList<Persoana> directori = new


ArrayList<Persoana>();

Not: Pentru gestionarea obiectelor dintr-un ArrayList se folosesc metode ca:

add() adaug un element la sfritul listei. Exemplu: personal.add(angajat);

get() returneaz un obiect din list. Exemplu: personal.get(index);

clear() terge elementele din list. Exemplu: personal.clear();

remove() terge elementul indicat. Exemplu: personal.remove(index);

10. Exemplu fundamental


10.1. Crearea clasei Persoana i instanierea ei
Creai un proiect nou denumit Proiect1 i un pachet (package) cu numele proiect1.
Creai o clas denumit Persoana.
Adugai clasei trei variabile (parametri): nume, pentru numele unei persoane (String),
prenume, pentru prenume (String) i an_nastere pentru anul naterii (int).
Adugai clasei un constructor fr parametri, care d valori implicite celor trei cmpuri.
Adugai clasei metoda scrieNume() care afieaz pe consol numele. Pentru scrierea pe
consol se folosete System.out.println().
Creai n acelai pachet o clas denumit Main care va conine doar metoda principal
(public static void main(String[] args)). n metoda principal se va crea o instan a
clasei Persoana.

18

10.2. Adugarea constructorului cu parametri


Adugai clasei Persoana un constructor care iniializeaz variabilele clasei cu valorile unor
parametri.
Creai n metoda main() nc o instan a clasei Persoana apelnd constructorul cu
parametri i apoi apelai metoda scrieNume() pentru noul obiect.

10.3. Definirea metodelor get i set


Definii ansamblul de metode care permit preluarea i impunerea valorilor variabilelor
instanelor. Aceste metode sunt denumite uzual setter i getter.
Numele metodelor getter ncepe cu get urmat de numele variabilei, prima liter din nume fiind
transformat n majuscul.
Numele metodelor setter ncepe cu set urmat de numele variabilei, prima liter din nume fiind
transformat n majuscul.
Exemplu, pentru cmpul nume se vor aduga clasei Persoana metodele setNume() i
getNume().
Adugai n metoda main() apeluri ale metodelor setter pentru primul obiect creat i nlocuii
valorile implicite cu alte valori.

10.4. Crearea clasei Adresa


Adugai proiectului o clas nou denumit Adresa avnd trei cmpuri: tara, oras i adr,
toate dinclasa String. Un obiect din clasa Adresa va pstra adresa unei persoane.
Adugai clasei Adresa un constructor cu parametri i ansamblul de metode setter i getter.
Modificai clasa Persoana adugndu-i cmpul adresa de tip Adresa i modificai
constructorii astfel nct noul cmp s fie iniializat corect. Scriei i pentru noul cmp metode set i get.

11.Solutie
11.1. Crearea clasei Persoana i instanierea ei
package proiect1;
public class Persoana {
private String nume;
private String prenume;
private int an_nastere;
public Persoana() {
nume = "Doe";
prenume = "John";

19

an_nastere = 1900;
}
public void scrieNume() {
System.out.println("Numele: " + nume);
}
public Persoana(String nume, String prenume, int an_nastere) {
this.nume = nume;
this.prenume = prenume;
this.an_nastere = an_nastere;
}
public String getNume() {
return nume;
}
public void setNume(String nume) {
this.nume = nume;
}
public String getPrenume() {
return prenume;
}
public void setPrenume(String prenume) {
this.prenume = prenume;
}
public int getAn_nastere() {
return an_nastere;
}
public void setAn_nastere(int an_nastere) {
this.an_nastere = an_nastere;
}
}

package proiect1;
public class Main {
public static void main(String[] args) {
Persoana anonim = new Persoana();
Persoana ana = new Persoana("Ionescu", "Ana", 1993);
ana.scrieNume();
anonim.setNume("Popescu");
anonim.setPrenume("Paul");
anonim.setAn_nastere(2001);
}

20

11.2. Crearea i utilizarea clasei Adresa


package proiect1;
public class Adresa {
private String tara;
private String oras;
private String adr;
public Adresa(String tara, String oras, String adr) {
this.tara = tara;
this.oras = oras;
this.adr = adr;
}
public String getTara() {
return tara;
}
public void setTara(String tara) {
this.tara = tara;
}
public String getOras() {
return oras;
}
public void setOras(String oras) {
this.oras = oras;
}
public String getAdr() {
return adr;
}
public void setAdr(String adr) {
this.adr = adr;
}
}

package proiect1;
public class Persoana {
private String nume;

21

private String prenume;


private int an_nastere;
private Adresa adresa;
public Persoana() {
nume = "Doe";
prenume = "John";
an_nastere = 1900;
}
public void scrieNume() {
System.out.println("Numele: " + nume);
}
public Persoana(String nume, String prenume, int an_nastere) {
this.nume = nume;
this.prenume = prenume;
this.an_nastere = an_nastere;
}
public String getNume() {
return nume;
}
public void setNume(String nume) {
this.nume = nume;
}
public String getPrenume() {
return prenume;
}
public void setPrenume(String prenume) {
this.prenume = prenume;
}
public int getAn_nastere() {
return an_nastere;
}
public void setAn_nastere(int an_nastere) {
this.an_nastere = an_nastere;
}
public Adresa getAdresa() {
return adresa;
}
public void setAdresa(Adresa adresa) {
this.adresa = adresa;
}

22

package proiect1;
public class Main {
public static void main(String[] args) {
Persoana anonim = new Persoana();
Persoana ana = new Persoana("Ionescu", "Ana", 1993);
ana.scrieNume();
Adresa a = new Adresa("Frana", "Grenoble", "34, Rue Fouquet");
ana.setAdresa(a);
anonim.setNume("Popescu");
anonim.setPrenume("Paul");
anonim.setAn_nastere(2001);
a = new Adresa("Romania", "Iai", "Str. Unirii Nr. 21 Ap. 12");
anonim.setAdresa(a);
}
}

12. Prezentarea limbajului Java


Fiind derivat din C++, limbajul Java nu pune probleme dificile celor care cunosc acest limbaj. De
aceea prezentarea elementelor fundamentale ale limbajului va fi realizat foarte succint.
12.1.

Comentarii

Programele Java conin explicaii sub forma unor comentarii. Acestea vor asigura n timp
nelegerea diferitelor metode i rolul funcional al variabilelor folosite.
ntr-un program scris n Java pot fi folosite dou tipuri de comentarii:

comentarii "n linie", introduse prin //. Un astfel de comentariu se ncheie la sfritul liniei
curente;

comentarii pe unul sau mai multe rnduri consecutive. Zona care conine comentariul este
delimitat prin /* (comentariu) */.

De regul se folosesc comentariile n linie, cel de-al doilea tip fiind folosit frecvent n timpul
depanrii programelor mari i complexe, pentru a suprima din program anumite zone.
Comentariile care ncep cu /** sunt prelucrate de aplicaia javadoc pentru realizarea automat a
unei pagini web coninnd comentariile programatorului. Aceast facilitate este folosit pentru
documentarea rapid a programelor mari, compuse din mai multe clase.
12.2.

Variabile
23

n Java numele unei variabile, metode sau clase poate fi orice combinaie de litere i cifre,
ncepnd cu o liter. Caracterele '_' (underscore) i '$' sunt considerate litere i pot intra n construcia
numelor. Nu pot fi folosite ca nume cuvintele rezervate folosite la definirea limbajului.

12.3.

abstract

double

int

strictfp

boolean

else

interface

super

break

extends

long

switch

byte

final

native

synchronized

case

finally

new

this

catch

float

package

throw

char

for

private

throws

class

goto

protected

transient

const

if

public

try

continue

implements

return

void

default

import

short

volatile

do

instanceof

static

while

true

false

null

Tipuri de date elementare

n Java, ca i n alte limbaje evoluate, sunt definite 8 tipuri de date elementare (primitive):
Cuvnt cheie
pt. declarare

Descriere

Mrime/Reprezentare intern

(numere ntregi)

24

byte

ntreg reprezentat pe un octet 8-bii, repr. in compl. fa de 2

short

ntreg scurt

16-bii, repr. in compl. fa de 2

int

Intreg

32-bii, repr. in compl. fa de 2

long

ntreg lung

64-bii, repr. in compl. fa de 2


(numere reale)

float

Simpl precizie

32-bii, IEEE 754

double

Dubl precizie

64-bii IEEE 754


(alte tipuri)

char

Un caracter

16-bii, repr. Unicode

boolean

O valoare logic

true sau false

Spre deosebire de alte limbaje, n Java informaiile din tabelul precedent sunt valabile indiferent
de calculatorul pe care se execut programul.
Observaii asupra tipului char:
Ca i n C++, n Java un caracter se reprezint ncadrat ntre apostroafe. Astfel 'C' sau '&' sunt
caractere. Unele caractere nu au simbol grafic. Cele mai uzuale se pot totui introduce folosind o
succesiune de dou caractere (secven escape) astfel: '\n' (LF), '\a' (bell), '\b' (backspace), '\f' (pagin
nou, formfeed), '\r' (retur car, carriage return), '\t' (tab orizontal), '\v' (tab vertical). Un exemplu n
acest sens poate fi scris pornind de la succesiunea de apeluri de metode care realizeaz afiarea pe
ecran a rezultatelor programului scris mai sus:
System.out.println("Gr. (barbat) = " + g + " kg");
System.out.println("Gr. (femeie) = " + 0.9*g + " kg");

System.out.println() asigur trecerea la linie nou dup afiarea irului de caractere introdus ca
i argument. Dac ns folosim un singur apel, acelai rezultat se obine folosind secvena escape '\n':
System.out.println("Gr. (barbat) = " + g + " kg\nGr. (femeie) = " + 0.9*g + " kg");
Pentru alte caractere care nu au echivalent grafic se va folosi o secven escape care folosete
codul hexazecimal al caracterului, astfel:
\xHH

caracter ASCII, HH este codul caracterului (n hexazecimal);

\uHHHH

- caracter UNICODE, HHHH este codul caracterului n hexazecimal.


Tabela ASCII

25

12.4.

iruri

Pentru a utiliza un ir, n Java trebuie declarat i apoi realizat alocarea memoriei necesare.
Exemple fundamentale:
int a[];
// Se poate scrie si int [] a;
a = new int[7];
// Se aloca memoria nec. - 7 locatii
int b[] = {1, 3, 4, 6, 10};

Pentru irul a se va rezerva n memorie o succesiune de 7 locaii. Deoarece elementele irului a


sunt de tip int, fiecare locaie va avea lungimea de 4 octei.
irul b a fost declarat i iniializat n acelai timp. Pentru elementele irului b se vor rezerva 5
locaii de memorie consecutive.
Pentru referirea elementelor irurilor se folosesc indici. Astfel, dup declararea irului a se va
putea scrie:

26

a[0] = 12;
a[2] = 21;
a[3] = a[0] + a[2];

irurile pot avea dou sau chiar mai multe dimensiuni. Exemplu:
int [ ] [ ] c;
c = new int [3] [4];
c[0] [2] = 17;
System.out.println("c(0,2) ="+c[0] [2]);

Lungimea unui ir, indiferent de tipul componentelor acestuia, poate fi obinut folosind
proprietatea .length.
Exemplu:

for (i=0; i<a.length; i++)

12.5.

Clasa String

n Java irurile de caractere sunt obiecte aparinnd clasei String. Declararea unui ir de
caractere poate fi realizat fie scriind:

String unu="Thomas ";

fie ca i n cazul declarrii i iniializrii obiectelor:


String doi;
doi = new String("Jerry");

Un ir de char (declarat char [ ]) poate fi transformat ntr-un obiect aparinnd clasei String.
Exemplu:
char data[] = {'a', 'b', 'c'};
String str = new String(data);

27

Unirea (concatenarea) mai multor obiecte de tip String anterior definite se realizeaz folosind
operatorul '+', astfel:
String trei;
trei=unu+" & " + doi;

// rezultat "Thomas & Jerry"

Se pot defini i iruri de iruri de caractere. Un astfel de ir se declar folosind o construcie


sintactic de tipul
String[] argumente;

Operaii cu iruri

Expresie

Explicaii

text1.equals("Dacia");

returneaz true dac text1 este egal cu "Dacia". Compararea este


case sensitive.

text1.equalsIgnoreCase("Dacia");

returneaz true dac text1 este egal cu "Dacia". Compararea nu


este case sensitive.

StringBuffer str1 = new


StringBuffer("Dacia");

Definete un ir de caractere de lungime variabil. Extinderea irului se


realizeaz folosind append().

str1.append(" Logan");

str.charat(1);

Returneaz caracterul de pe pozitia 1. Numrarea ncepe de la 0.

str.substring(1);

Suprim primele caractere.

str.substring(1, 5);

Returneaz subirul format din caracterele 1 la 5 (numrnd de la 0).

28

Expresie

Explicaii

str.indexOf(String)

Returneaz poziia (int) a primei apariii n str a irului specificat.

str.lastIndexOf(String)

Returneaz poziia (int) a ultimei apariii n str a irului specificat.


StringBuffer nu suport aceast metod. Pentru a o utiliza se va
converti obiectul de tip StringBuffer n String folosind metoda
toString().

str.endsWith(String)

Returneaz true dac str se termin cu irul String

str.startsWith(String)

Returneaz true dac str ncepe cu irul String

str.trim()

Suprim spaiile inutile de la nceput i de la sfrit.

str.replace(str1,str2)

nlocuiete toate apariiile din str ale str1 cu str2.

str.concat(str1);

Concateneaz str1 la sfritul lui str.

str.toUpperCase()
str.toLowerCase()

Convertete str n varianta cu majuscule respectiv litere mici.

str1 + str2

Concateneaz (unete) irurile str1 i str2

String[] sirval = sir.split("-");


String[] zeug =
myString.split("\\.");

Returneaza un sir de String obtinut prin separarea sirului sir in


subsiruri folosind ca separator "-". n exemplul 2 separatorul este \,
care trebuie dublat deoarece altfel ar fi interpretat ca secv. escape.

String.format("%.00f",
engSpeed.doubleValue())

Returneaz irul obinut din valoarea engSpeed.doubleValue()


prin meninerea doar a primelor dou zecimale.

29

Conversii de tip
Frecvent valorile numerice trebuie convertite n iruri de caractere (String) sau iruri de
caractere trebuie convertite n valorile numerice echivalente.

// Conversii dinspre tip numeric spre String...


// Conversie din int n String
String s1 = String.valueOf (10); // s1 = "10"
// Conversie din double n String
String nrpi = String.valueOf (Math.PI); // "3.141592653589793"
// Conversie din boolean in String
String s3 = String.valueOf (1 < 2); // "true"
// Conversie din Date in String. new Date() returneaza data curenta
String s4 = String.valueOf (new Date()); // " Wed Jan 08 15:34:18 EET
2014"
// Si invers ...
// Conversie din String spre int
int i = Integer.parseInt(String);
// Conversie din String spre float
float f = Float.parseFloat(String);
// Conversie din String spre double
double d = Double.parseDouble(String);

Conversie din double spre int:


int i = (int) val_double;

Conversia tipului SQL Date:

package test;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
. . .
SimpleDateFormat template = new SimpleDateFormat("dd-MM-yyyy");
java.util.Date enddate = new java.util.Date("10/31/99");
java.sql.Date sqlDate = java.sql.Date.valueOf(template.format(enddate));

30

12.6.

Literali

n timpul scrierii unui program, programatorul folosete frecvent literali. Literalii sunt valori
aparinnd tipurilor primitive prezentate. Compilatorul analizeaz aceste valori, le stabilete tipul, le
convertete i le memoreaz n locaii din memorie. De exemplu, n clasa Greutate aprea atribuirea:

h = 178;

Compilatorul va asocia literalului "178" tipul int., va face conversia n binar corespunztoare i va
memora rezultatul ntr-o zon din memorie avnd o lungime de 4 octei. La fel, n expresia greutii:

g = 50.0+0.75*(h-150)+0.25*(v-20);

Compilatorul va considera c 50.0, 0.75 i 0.25 sunt double (numere reale n dubl precizie) iar
150 i 20 sunt int (numere ntregi).
Exemple fundamentale:

12.7.

Operatorii

definirea unui
folosii
la
scrierea
reprezint
o
etap
folosesc un mare numr de
de operatori pentru a putea
aparinnd
tipurilor

Literal

Tipul de dat

178

int

8864L

long

37.266

double

37.266D

double

87.363F

float

26.77e3

double

'c'

char

true

boolean

false

boolean

limbajului Java
limbaj, stabilirea operatorilor care pot fi
expresiilor i a regulilor lor de utilizare
important.
Limbajele de nivel nalt
operatori i chiar permit extinderea setului
scrie expresii n care intervin variabile
structurate (obiecte).

Operatorii matematici din Java


+

% (modulo)

x % y furnizeaz restul mpririi ntregi a lui x la y.

Exemplu de utilizare a operatorului '%':

31

if((an % 4 == 0 && an % 100 !=0) || an % 400 == 0)


System.out.println(an + " este bisect.");

Operatorul % nu se aplic tipurilor float i double.


Operatorul "/" poate provoca trunchiere n cazul operanzilor ntregi.
Evaluarea expresiilor aritmetice se efectueaz de la stnga la dreapta respectnd ordinea de
evaluare normal.
Operatorii de comparare i logici
Operatorii de comparare (relaionali) din Java sunt : > >= < <= == !=
Operatorii de comparare au o prioritate inferioar celor aritmetici :
i < lim + 1

se evalueaz ca i

i < (lim + 1)

O expresiile n care intervine o succesiune de operatori logici && (i) sau o succesiune de
operatori || (sau) sunt evaluate de la stnga la dreapta i evaluarea expresiei nceteaz cnd se tie deja
valoarea de adevr a rezultatului.
&& e mai prioritar ca i || iar ambele sunt mai puin prioritare ca i operatorii de comparaie.
Operatorul ! (negaie)
if (!corect) . . . identic cu

if (corect == false) . . .

Conversiile de tip
Cnd ntr-o expresie intervin operanzi de tipuri diferite, operanzii corespunznd unui tip mai
restrictiv se convertesc automat spre tipul mai general astfel nct nu se produce pierdere de informaie.
Dac rezultatul unei expresii este float sau double i este atribuit unei variabile de tip ntreg,
compilatorul va sesiza posibila pierdere de informaie i va semnala o eroare.

Operatorii de conversie de tip (transtipaj sau cast)


(nume-tip) expresie
expresie este convertit n tipul specificat :
x = Math.sqrt((double)n)
alfa = (float)a / j ;

32

Operatorii de incrementare i de decrementare ++ i -n funcie de poziia operatorului fa de variabila incrementat, se realizeaz pre i post
incrementare (decrementare)
int n = 5 ;
x = n++ ;

x = ++n ;

atribuie 5 lui x

atribuie 6 lui x

Operatorii i expresiile de atribuire


Expresia :
i = i + 3;

n care variabila din stnga egalului se repet n dreapta acestuia se mai poate scrie astfel :
i += 3 ;

+= este n acest caz un operator de atribuire.

n general n Java,
exp1
exp1

op=
=

exp2 ;
exp1 op

echivaleaz cu
(exp2) ;

unde op este + - * / %.

Exemplu fundamental:
x *= y + 1 ;

echivaleaz cu :
x = x * (y + 1) ;

i nu cu
33

x = x * y + 1 ;

Expresiile condiionale
Pentru a calcula expresia:
z = max(a, b) ;

se poate scrie

if (a > b)
max = a ;
else
max = b ;

Limbajul Java ofer i o alt cale :


max = (a > b) ? a

12.8.

: b ;

Instruciunile limbajului Java

Instruciunea de decidere - if
Ansamblul de instruciuni cuprinse ntre acolade formeaz o instruciune compus sau un bloc
de instruciuni. Instruciunile din interiorul unui bloc de instruciuni sunt executate n ordinea n care
sunt scrise.

Variante de scriere a instruciunii if


if ( expLogica )
instruciune;
if (expLogica )
instruciune;
else

if (expLogica )
{
mai multe
instruciuni
}
if (expLogica )
{
mai multe
instruciuni
34

instruciune;

}
else
{
mai multe
instruciuni
}

if (expLogica )
instruciune;
else
{
mai multe
instruciuni
}

if (expLogica )
{
mai multe
instruciuni
}
else
instruciune;

Indentarea (scrierea decalat) instruciunilor sau a blocurilor de instruciuni din if nu este


obligatorie dar are mare importan n nelegerea i depanarea programului.

Instruciunea while
Instruciunea while permite realizarea unei structuri repetitive (ciclu) condiionate anterior.
Corpul ciclului poate fi executat o dat, de mai multe ori sau de loc.
Exemplu fundamental:
int contor = 1;
while ( contor <= 3 )
{
System.out.println("Contor = "+contor);
contor = contor + 1;
// sau mai bine contor++
}
System.out.println("La revedere!");

Sintaxa instruciunii while este:


while ( condiie )

instruciune

Condiia este o expresie logic.

Sintaxa instructiunii while

35

while (
while (

condiie )

condiie )

instruciune;

una sau m.
m. instruciuni
}

Instruciunea do
Pentru programarea unui ciclu poate fi folosit ntotdeauna instruciunea while. Deoarece while
ncepe prin executarea unui test, n cazul n care variabila testat nu poate primi valori dect n interiorul
ciclului, programatorul trebuie s-i dea la nceput o valoare convenabil pentru a determina intrarea n
ciclu. Exacutarea instruciunilor din corpul ciclului va corecta automat valoarea iniial.
Pentru astfel de cazuri exist ns i o cale mai simpl, respectiv folosirea instruciunii do.
Exemplu:
g = 9.81;
t = 0;
do
{
d = (g * t * t ) / 2;
System.out.println( t + "
t = t + 1;
}
while (d <= 500);

" + d);

Instruciunea for
Instruciunea for este preferat ori de cte ori trebuie realizat un ciclu care folosete un
contor. Ea poate fi ns folosit ns n toate cazurile n care trebuie s realizm un ciclu, i reprezint o
modalitate compact i elegant de scriere a acestora.
Dac naintea unui ciclu trebuie realizate mai multe iniializri, acestea pot scrise n for una
dup alta, desprite prin virgule:
public int suma (int[] a) {
int i, sum;
for (i=0,sum = 0; i<a.length; i++)
sum = sum + a[i];
return sum;
}

Oricare dintre cele trei pri ale instruciunii for pot lipsi. Lipsa condiiei de reluare este
echivalent cu a scrie o condiie care este ntotdeauna adevrat. Ieirea dintr-un astfel de ciclu se
poate face folosind instruciunea break.

36

Exemplu:
for ( ; ; )
{
. .
break;
. .
}

Executarea instruciunii break provoac o ieire imediat din ciclul for. Ea poate fi folosit i
pentru a iei din ciclurile while sau do.

Instruciunea for pentru parcurgerea irurilor i a listelor


Pentru iruri i liste prelucrate integral, element cu element, Java ofer o variant adaptat a
instruciunii for.
for(declaratie : sir_de_valori)
{
. . .
}

sau, pentru un ArrayList<String>:


for (String s : arrayList)
{
. . .
}

Exemplu de utilizare:
int[] sir;

// aloc memorie pentru 7 valori intregi


sir = new int[10];

// dau valori
sir[0] =
sir[1] =
sir[2] =
sir[3] =
sir[4] =
sir[5] =
sir[6] =
int suma

9;
4;
23;
17;
63;
19;
54;
= 0;

37

for (int i : sir) {


suma += sir[i];
}

Instruciunea switch
Instruciunile de ciclare prezentate, while, do i for sunt folosite pentru realizarea blocurilor de
instruciuni a cror execuie ncepe cu prima linie i este controlat de ctre programator. Instruciunea
switch este folosit tot pentru a construi un bloc de instruciuni dar punctul de unde ncepe execuia
depinde de valoarea unei expresii avnd valori ntregi.
Sintaxa instruciunii este:

switch (expresie)
{

case constanta_1 :
case constanta_2 :

instruciuni
instruciuni

. . .

default :

instruciuni;

Fiecare dintre punctele de unde poate ncepe execuia blocului este etichetat printr-o constant
avnd valoare ntreag. Dac expresia de testat corespunde uneia dintre constante, execuia blocului
ncepe din punctul indicat de aceasta.
Ramura introdus prin default este facultativ.
Exemplu :
switch (t)
{
case 's' :
rez = Math.sin(Math.PI * x / 180.);
System.out.println("rezultatul este : "+rez);
break;
case 'c' :
rez = Math.cos(Math.PI * x / 180.);
System.out.println("rezultatul este : "+rez);
break;
case 't' :
rez =
Math.sin(Math.PI * x / 180.)/Math.cos(3.14159 * x / 180.);
System.out.println("rezultatul este : "+rez);
break;
default:
System.out.println("Caracter incorect!");

38

Ca i n cazul ciclurilor, instruciunea break provoac o ieire imediat din blocul realizat
folosind switch.

39

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