Documente Academic
Documente Profesional
Documente Cultură
2
LUCRAREA NR. 2
Clase și obiecte. Primitive și referințe. Java API.
1. Scopul lucrării
Lucrarea de laborator are ca scop prezentarea elementelor de bază ale limbajului Java. Pe baza exemplelor
ce vor fi prezentate se va pune în evidență structura unui program Java, noțiunile de clase și obiecte, tipurile
de date, operatorii limbajului Java. De asemenea se va descrie pe scurt biblioteca API.
2. Clase și obiecte
O clasă este schița (modelul) unui obiect. Clasa spune mașini virtuale Java cum să construiască un obiect de
tipul respectiv.
Atunci când proiectați o clasă trebuie să vă gândiți la obiectele care vor fi create din clasa respectivă. Adică să
vă gândiți la:
- ceea ce știu obiectele
- ceea ce fac obiectele
Lucrurile pe care le știe un obiect despre el însuși se numesc variabile de instanță. Acestea reprezintă
starea unui obiect. Lucrurile pe care le face un obiect se numesc metode. Acestea reprezintă
comportamentul unui obiect.
Exemplu:
Buton
variabile de eticheta
instanță culoare știe
setCuloare()
setEticheta()
metode apasaButon() face
elibereazaButon()
Laborator Programare Java Lucrarea nr. 2
Orice obiect creat în Java este păstrat într-o zonă de memorie numită zona heap cu colectarea gunoiului.
Atunci când mașina virtuală Java decide că un obiect nu mai poate fi folosit, acesta este șters.
Într-o aplicație Java obiectele comunică între ele prin apelarea metodelor. Pentru lansarea aplicației Java se
folosește metoda main().
În continuare se va prezenta un program simplu pentru a avea o idee asupra modului cum comunică între ele
obiectele.
Aplicație: Joc de ghicit
Programul conține un obiect care reprezintă jocul și trei obiecte care reprezintă jucătorii. Jocul generează un
număr aleatoriu între 0 si 9, iar cele trei obiecte jucători încearcă să ghicească numărul.
Clasele vor fi: JocDeGhicit, Jucator și LansareJoc. (vezi figura de mai jos)
Clasa JocDeGhicit conține metoda main() și are rolul de a lansa aplicația. În metoda main() este creat un
obiect JocDeGhicit și este apelată metoda startJoc().
Jucator p1;
Jucator p2;
Jucator p3;
p1.incearca();
p2.incearca();
Laborator Programare Java Lucrarea nr. 2
p3.incearca();
numarAles1 = p1.numar;
System.out.println("Jucatorul unu a ales " + numarAles1);
numarAles2 = p2.numar;
System.out.println("Jucatorul doi a ales " + numarAles2);
numarAles3 = p3.numar;
System.out.println("Jucatorul trei a ales " + numarAles3);
if (numarAles1 == numarulTinta) {
p1aGhicit = true;
}
if (numarAles2 == numarulTinta) {
p2aGhicit = true;
}
if (numarAles3 == numarulTinta) {
p3aGhicit = true;
}
În Java variabilele sunt împărțite în două categorii: primitive și referințe de obiecte. Variabilele au nevoie de un
nume și de un tip. Fiecare variabilă primitivă are un număr fix de biți. Cele opt tipuri primitive sunt: boolean,
char (16 biți), byte (8 biți) , short (16 biți), int (32 biți), long (64 biți), float (32 biți), double (64 biți).
Mai jos sunt date câteva reguli ce trebuie respectate în ceea ce privește numele unei variabile:
- numele poate să înceapă cu o literă, o liniuță de subliniere ( _ ) sau cu $. Nu poate începe cu o cifră.
- după primul caracter se pot folosi cifre.
- numele nu pot fi din lista cuvintelor rezervate din Java.
Se recomandă ca numele unei variabile să înceapă cu literă mică, fiecare cuvânt ce urmează începând cu
majusculă.
Din categoria tipurilor referință fac parte tipul tablou pentru lucrul cu tablouri de elemente, tipul clasă (tipul
generic de date) și tipul interfață (tipul abstract de clasă). O variabilă de tip referință reprezintă adresa unde se
află variabila respectivă și nu valoarea variabilei. Obiectele există în zona heap cu colectarea gunoiului. O
referință are valoarea null atunci când nu referă nici un obiect.
Laborator Programare Java Lucrarea nr. 2
Exemplu: viața în zona heap cu colectarea gunoiului
Carte b = new Carte ( );
Carte c = new Carte ( );
// Se declară două variabile referințe de tip Carte. Se creează două noi obiecte Carte și atribuie obiectele Carte
// către referințe. Cele două obiecte Carte există acum în zona heap.
// Referințe: 2
//Obiecte: 2
Carte d = c;
// declară o nouă referință de tip Carte. Se atribuie variabilei d valoarea variabilei c. Atât c, cât și d referă
//același obiect.
// Referințe: 3
// Obiecte: 2
c = b;
// Atribuie variabilei c valoarea variabilei b. Atât b, cât și c referă același obiect.
// Referințe: 3
// Obiecte: 2
Tablourile sunt întotdeauna obiecte, chiar dacă sunt declarate pentru stocarea valorilor primitive sau a
referințelor de obiecte.
Exemplu: matrice
// declară o matrice de numere întregi
int [ ] numere;
// creează o nouă matrice de numere întregi cu lungimea 4 și se atribuie variabilei numere declarată anterior
numere = new int[4];
//atribuie fiecărui element al matricei o valoare întreagă
numere[0] = 8;
numere[1] = -3;
numere[2] = 10;
numere[3] = 0;
Exemplul 2
//declară o matrice de obiecte Carte
Carte [ ] carti;
//creează o nouă matrice de obiecte Carte, cu lungimea 4 și se atribuie variabilei carti de tip Carte [ ],
//declarată anterior
Laborator Programare Java Lucrarea nr. 2
carti = new Carte [4];
// creează noile elemente Carte și le atribuie elementelor matricei.
carti [0] = new Carte( );
carti [1] = new Carte( );
carti [2] = new Carte( );
carti [3] = new Carte( );
Obs. Pentru a compara două variabile primitive se folosește operatorul ==. De asemenea, pentru a verifica
dacă două referințe sunt egale (adică dacă referă același obiect din zona heap) se poate folosi operatorul ==.
Dar pentru a verifica dacă două obiecte diferite sunt egale se utilizează metoda equals() din pachetul
java.lang. Această metodă este moștenită din clasa Obiect.
Pentru a exemplifica utilizarea diverșilor operatori ai limbajului Java, precum și utilizarea structurilor de control,
în cele ce urmează se va construi o aplicație care simulează jocul Submarine (bătălie navală) între utilizator și
calculator. Scopul aplicației este de a încerca scufundarea vapoarelor calculatorului cu un număr cât mai mic
de încercări.
Cadrul de desfășurare a jocului este următorul: la lansarea în execuție a aplicației, calculatorul plasează trei
obiecte Vapor într-un careu virtual cu 7x7 căsuțe. Apoi aplicația va cere utilizatorului să facă prima încercare.
Până vom învăța să construim o interfață grafică, vom utiliza o versiune în care vom utiliza convenția că o
celulă va fi reprezentată prin valori ca B3 (vezi figura de mai jos). Fiecare obiect Vapor ocupă trei celule. Ca
răspuns la încercarea utilizatorului se va afișa „Lovit”, „Ratat” sau „Ai scufundat Vaporul Rosu”, iar când s-a
terminat de distrus toate obiectele Vapor, jocul se termină și se afișează o evaluare a performanțelor.
A
B
C
D
E
F
G
0 1 2 3 4 5 6
Laborator Programare Java Lucrarea nr. 2
Ideile de bază ale aplicației sunt:
1) Utilizatorul lansează jocul
- aplicația creează cele trei obiecte Vapor
- aplicația plaseasă cele trei obiecte Vapor în careul virtual
2) Începe jocul
Se repetă următoarele operații până la terminarea obiectelor Vapor:
- se cere utilizatorului să facă o încercare (“B3”, “F5”…)
- se compară încercarea utilizatorului cu obiectele Vapor pentru a vedea dacă un obiect a fost lovit, ratat
sau distrus. Dacă obiectul a fost lovit, șterge celula. Dacă obiectul a fost distrus, șterge obiectul Vapor.
3) Jocul se termină
- se afișează performanțele utilizatorului în funcție de numărul de încercări.
Toate aceste etape se pot observa ușor din următoarea schemă logică:
Laborator Programare Java Lucrarea nr. 2
Programul va conține următoarele clase: Vapor, ScufundareVapoare și PlasareVapoare.
Clasa Vapor are o variabilă nume în care va fi păstrat numele obiectului Vapor (ex: „Rosu”, „Galben”,
„Albastru”), astfel încât fiecare obiect Vapor să-și poată afișa numele atunci când este distrus.
Clasa ScufundareVapoare creează obiectele Vapor, le dă câte un nume și le plasează într-un careu. Tot în
această clasă se verifică încercările făcute de utilizator și continuă jocul până când toate obiectele Vapor sunt
distruse. Această clasă conține metoda main( ) în corpul căreia se instanțiază obiectul ScufundareVapoare
care asigură apoi desfășurarea jocului.
Clasa PlasareVapoare citește informațiile introduse de utilizator și stabilește pozițiile obiectelor Vapor.
Codul corespunzător jocului prezentat este:
Clasa ScufundareVapoare
package lab2;
import java.util.*;
Laborator Programare Java Lucrarea nr. 2
verificaIncercare(incercare); 9
}
sfarsitJoc(); 10
}
rezultat = vTest.verificaVapor(incercare); 14
if (rezultat.equals("lovit"))
{
break; 15
}
if (rezultat.equals("distrus"))
{
listaVapoare.remove(vTest); 16
break;
}
}
System.out.println(rezultat); 17
}
Clasa Vapor
package lab2;
import java.util.ArrayList;
Laborator Programare Java Lucrarea nr. 2
public class Vapor {
private ArrayList<String> locatieCelule;
Clasa PlasareVapoare
package lab2;
import java.io.*;
import java.util.*;
}
return inc.toLowerCase();
}
public ArrayList<String> plasare(int dim) {
ArrayList<String> celule = new ArrayList<String>();
String temp = null;
int [] coord = new int[dim];
int proba = 0;
boolean succes = false;
int locatie = 0;
nr++;
int incr = 1;
if ((nr % 2) == 1) {
incr = lungCadru;
}
int x = 0;
succes = true;
while (succes && x < dim) {
if (cadru[locatie] == 0) {
coord[x++] = locatie;
locatie += incr;
if (locatie >= dimCadru){
succes = false;
}
if (x>0 & (locatie % lungCadru == 0)) {
succes = false;
}
} else {
succes = false;
}
}
}
int x = 0;
int lin = 0;
int col = 0;
while (x < dim) {
cadru[coord[x]] = 1;
lin = (int) (coord[x] / lungCadru);
col = coord[x] % lungCadru;
temp = String.valueOf(litere.charAt(col));
celule.add(temp.concat(Integer.toString(lin)));
x++;
}
return celule;
}
}
Laborator Programare Java Lucrarea nr. 2
În aplicația prezentată s-au folosit diverse instrucțiuni ale limbajului Java, cele mai multe dintre ele fiind
similare celor din limbajul C++. În continuare se va descrie instrucțiunea for îmbunătățită, specifică limbajului
Java, inclusă începând cu versiunea Java 5. Se mai întâlnește sub numele “for each”.
for(int x : numere ){
System.out.print( x );
System.out.print(",");
}
System.out.print("\n");
String [] nume = {"Alina", "Maria", "Alex", "Paul"};
for( String n : nume ) {
System.out.print( n );
System.out.print(",");
}
}
}
Alte elemente noi întâlnite în aplicația Submarine sunt prezentate în continuare.
Metoda random
- este folosită pentru a genera și returna un număr aleator între 0 și 1 ( mai precis 0.9999...)
Laborator Programare Java Lucrarea nr. 2
Exemplu:
int nrAleator = (int) (Math.random() * 7);
- variabila declarată nrAleator de tip întreg va stoca numărul aleator returnat de metoda random( )
- metoda random( ) face parte din clasa Math, din pachetul java.lang.
- metoda random( ) returnează o valoare de tip double, de aceea s-a făcut o conversie la tipul int,
conversia eliminând partea fracționară a valorii double.
- nrAleator va primi o valoare întreagă cuprinsă între 0 și 6.
Clasa String
Limbajul Java implementează noțiunea de șir de caractere cu ajutorul clasei String, din pachetul
java.lang. Clasa String oferă o serie de metode pentru lucrul cu șiruri de caractere, în cele ce urmează le
com descrie doar pe cele ce apar în aplicația Submarine:
public int length ( )
- returnează lungimea șirului de caractere pentru care se apelează metoda.
public Boolean equals ( Object o)
- expresia a.equals(b) returnează true dacă șirurile a și b sunt identice și false în caz contrar.
- această metodă suprascrie metoda moștenită din clasa Object.
public char charAt ( int index)
- returnează caracterul de la indicele specificat ca parametru, pentru obiectul String ce apelează
metoda.
public static String valueOf ( char c)
- returnează șirul corespunzător caracterului dat ca parametru
- această metodă este supraîncărcată
public String concat ( String str)
- concatenează șirul specificat ca parametru cu șirul care apelează metoda și returnează șirul rezultat.
public String toLowerCase ( )
- convertește toate caracterele șirului care apelează metoda în minuscule și returnează șirul rezultat.
Clasa ArrayList
Această clasă va fi discutată în detaliu în laboratorul următor. Deocamdată este suficient să știm despre
ArrayList că reprezintă o colecție de obiecte, poate stoca orice tip de obiecte. face parte din pachetul
java.util și are metode care permit diverse operații cum sunt: adăugarea unui obiect, ștergerea unui obiect,
găsirea unui obiect, aflarea numărului de obiecte etc. Le vom discuta doar pe cele care apar în aplicația
propusă:
public boolean add ( Object o)
- adaugă în listă obiectul furnizat ca parametru și returnează true
Laborator Programare Java Lucrarea nr. 2
public int indexOf (Object elem)
- returnează indicele obiectului specificat sau -1 dacă obiectul nu se găsește în listă (colecție)
public Object remove (int index)
- șterge din listă obiectul aflat la indicele furnizat ca parametru, dacă indicile depășește domeniul de
valori se aruncă o excepție.
public boolean isEmpty ( )
- returnează true dacă lista nu conține nici un element și false în caz contrar.
5. Java API
API (Application Programming Interface) – interfața de programare a aplicațiilor. Pachetele API conțin
clase și interfețe pentru construirea aplicațiilor.
Orice clasă din Java face parte dintr-un pachet. Pachetele au un nume, cum ar fi javax. Swing. Orice
clasă are un nume complet, care este o combinație între numele pachetului și numele clasei. De exemplu,
numele complet al clasei ArrayList este java.util.ArrayList. Pentru a folosi o clasă dintr-un alt pachet
decât java.lang, trebuie cunoscut numele complet al clasei.
Există două soluții pentru a specifica ce clasă folosim:
- folosind instrucțiunea import la începutul fișierului ce conține codul sursă:
import java.util.ArrayList;
- specificând numele complet al clasei ori de câte ori se folosește clasa în cod:
a) la declararea sau instanțierea unei variabile
java.util.ArrayList <String> lista = new Java.util.ArrayList<String> ( );
b) pentru tipurile argumentelor
public void test ( java.util.ArrayList <String> list) {… }
c) pentru tipurile valorilor returnate
public java.util.ArrayList <String> sir ( ) { …}
Pachetul de distribuție Java include un set de documentație online, numit tocmai Java API. Pentru mai
multe detalii consultați pagina : http://download.oracle.com/javase/6/docs/api .
Laborator Programare Java Lucrarea nr. 2
6. Verificarea cunoștințelor
Laborator Programare Java Lucrarea nr. 2
2) Ce s-ar putea întâmpla dacă obiectele Vapor al aplicației Submarine nu ar fi șterse în urma acțiunii
“distrus” ?
3) Asociază comentariile de mai jos cu numerele plasate în codul clasei ScufundareVapoare:
a) obține informațiile introduse de utilizator
b) cere obiectului PlasareVapoare să furnizeze o poziție pentru un obiect Vapor
c) apelează metoda verificaIncercare( )
d) declară și inițializează variabilele necesare
e) apelează această metodă a obiectului Vapor pentru a stabili poziția furnizată de obiectul
PlasareVapoare
f) repetă pentru fiecare obiect Vapor din listă
g) afișează instrucțiuni sumare pentru utilizator
h) apelează metoda sfarsitJoc( )
i) creează trei obiecte Vapor, le denumește și le adaugă în lista ArrayList
j) atât timp cât lista de obiecte Vapor nu este goală
k) creează o listă ArrayList de obiecte Vapor
l) repetă pentru toate obiectele Vapor din listă
m) afișează rezultatul pentru utilizator
n) cere obiectului joc să creeze cadrul general al jocului
o) presupune că încercarea este ratată dacă nu va stabili altceva
p) afișează un mesaj prin care-i spune utilizatorului cum s-a descurcat în joc
q) iese din ciclu mai devreme, deoarece nu este necesară testarea celorlalte obiecte
r) incrementează numărul de încercări făcute de utilizator
s) acest obiect a fost distrus, așa că îl scoatem din listă și ieșim din ciclu
t) cere obiectului Vapor să verifice dacă încercarea făcută de utilizator este o lovitură reușită și
dacă obiectul a fost distrus
u) creează obiectul joc
v) cere jocului să înceapă executarea ciclului principal (continuă să citească încercările introduse
de utilizator și să le verifice)