Sunteți pe pagina 1din 16

Laborator Programare Java Lucrarea nr.

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().

LansareJoc JocDeGhicit Jucator


p1 numar
p2
p3
main(String[ ] args) startJoc() incearca()

public class JocDeGhicit {

Jucator p1;
Jucator p2;
Jucator p3;

public void startJoc() {


p1 = new Jucator();
p2 = new Jucator();
p3 = new Jucator();
int numarAles1 = 0;
int numarAles2 = 0;
int numarAles3 = 0;
boolean p1aGhicit = false;
boolean p2aGhicit = false;
boolean p3aGhicit = false;
int numarulTinta = (int) (Math.random() * 10);
System.out.println("Ma gandesc la un numar intre 0 si 9.");
while(true) {
System.out.println("Numarul care trebuie ghicit este " + numarulTinta);

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;
}

if (p1aGhicit || p2aGhicit || p3aGhicit)


{
System.out.println("Avem un castigator!");
System.out.println("Jucatorul unu a ghicit? " + p1aGhicit);
System.out.println("Jucatorul doi a ghicit? " + p2aGhicit);
System.out.println("Jucatorul trei a ghicit? " + p3aGhicit);
System.out.println("Jocul s-a terminat.");
break;
}
else
{
System.out.println("Jucatorii trebuie sa incerce din nou.");
}
}
}
}

public class Jucator {


int numar = 0;
public void incearca()
{
numar = (int) (Math.random() * 10);
System.out.println("Cred ca este numarul " + numar);
}
}

public class LansareJoc {


public static void main (String[] args) {
JocDeGhicit joc = new JocDeGhicit();
joc.startJoc();
}
}
Creați un proiect care să cuprindă clasele menționate și observați rezultatele execuției programului. Adăugați
comentarii în cod pentru a explica funcționarea programului.
 
 
Laborator Programare Java Lucrarea nr. 2

3. Tipuri primitive și referințe

Î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.

Pașii pentru declararea, crearea și atribuirea unui obiect sunt:

1) se declară o variabilă referință


Carte oCarte = new Carte( );
Această instrucțiune cere mașinii Java să aloce spațiu pentru o variabilă referință și o numește oCarte.
2) se creează un obiect
Carte oCarte = new Carte( );
Această instrucțiune cere mașinii Java să aloce spațiu pentru noul obiect Carte în zona heap.
3) se leagă obiectul de referință
Carte oCarte = new Carte( );
Noul obiect Carte este atribuit variabilei referință oCarte.

 
 
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.

4. Operatori. Structuri de control.

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.*;

public class ScufundareVapoare {


private PlasareVapoare pv = new PlasareVapoare();
private ArrayList<Vapor> listaVapoare = new ArrayList<Vapor>();
1 private int nrIncerc = 0;

private void setUpJoc() {


Vapor v1 = new Vapor();
v1.setNume("Rosu");
Vapor v2 = new Vapor();
v2.setNume("Galben");
Vapor v3 = new Vapor();
v3.setNume("Albastru"); 2
listaVapoare.add(v1);
listaVapoare.add(v2);
listaVapoare.add(v3);

System.out.println("Scopul jocului este sa scufunzi trei vapoare:");


System.out.println("Rosu, Galben, Albastru.");
3
System.out.println("Incearca sa le scufunzi din cat mai putine incercari!");

for (Vapor vap : listaVapoare) { 4


ArrayList<String> locatie = pv.plasare(3);
5
vap.setLocatieCelula(locatie); 6
}
}

private void startJoc() {


while (!listaVapoare.isEmpty()) { 7
String incercare = pv.citireIncerc("Incercarea ta este:"); 8

 
 
Laborator Programare Java Lucrarea nr. 2

 
verificaIncercare(incercare); 9
}
sfarsitJoc(); 10
}

private void verificaIncercare(String incercare)


{
nrIncerc++; 11
String rezultat = "ratat"; 12
for (Vapor vTest : listaVapoare) 13
{

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
}

private void sfarsitJoc() {


System.out.println("Toate vapoarele sunt distruse!");
if (nrIncerc <= 18) {
System.out.println("Ti-a luat doar " + nrIncerc + " incercari");
System.out.println("Felicitari!");
}
else 18
{
System.out.println(" Ti-a luat cam mult. " + nrIncerc + " incercari.");
System.out.println("Mult success data viitoare!.");
}
}

public static void main(String[] args) {


ScufundareVapoare joc = new ScufundareVapoare(); 19
joc.setUpJoc(); 20
joc.startJoc(); 21
}
}

Clasa Vapor
package lab2;

import java.util.ArrayList;

 
 
Laborator Programare Java Lucrarea nr. 2

 
public class Vapor {
private ArrayList<String> locatieCelule;

public void setLocatieCelula(ArrayList<String> loc)


{
locatieCelule = loc;
}

public String verificaVapor(String in)


{
String rezultat = "ratat";
int index = locatieCelule.indexOf(in);
if (index >= 0) {
locatieCelule.remove(index);
if (locatieCelule.isEmpty()) {
rezultat = "distrus";
}
else
{
rezultat = "lovit";
}
}
return rezultat;
}
private String nume;
public void setNume(String string) {
nume = string;
}
}

Clasa PlasareVapoare
package lab2;

import java.io.*;
import java.util.*;

public class PlasareVapoare {

private static final String litere = "abcdefg";


private int lungCadru = 7;
private int dimCadru = 49;
private int [] cadru = new int[dimCadru];
private int nr = 0;

public String citireIncerc (String text) {


String inc = null;
System.out.print(text + " ");
try {
BufferedReader is = new BufferedReader(
new InputStreamReader(System.in));
inc = is.readLine();
if (inc.length() == 0 ) return null;
} catch (IOException e) {
System.out.println("IOException: " + e);
 
 
Laborator Programare Java Lucrarea nr. 2

 
}
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;
}

while ( !succes & proba++ < 200 ) {


locatie = (int) (Math.random() * dimCadru);

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 îmbunătățit (enhanced for)


Această instrucțiune simplifică parcurgerea iterativă a elementelor unui tablou sau ale unei alte colecții.
Exemplu:
for ( String nume : numeTablou)
{
// corpul ciclului …
}
Pentru fiecare element din numeTablou se atribuie elementul variabilei nume și se execută corpul ciclului.
Cum se execută for-ul din exemplul de mai sus:
- se creează o variabilă numită nume și i se atribuie valoarea null
- se atribuie variabilei nume prima valoare din numeTablou
- se execută corpul ciclului
- atribuie variabilei nume următoarea valoare din numeTablou
- repetă atât timp cât mai există elemente în tablou

Ce va afișa codul de mai jos?


public class EnhancedFor {
public static void main(String args[]){
int [] numere = {10, 20, 30, 40, 50};

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

1) Ce diferență este între o clasă și un obiect?


2) Alegeți care dintre instrucțiunile de mai jos sunt permise dacă toate liniile ar face parte din aceeași
metodă:
1. int x = 34.5;
2. boolean boo = x;
3. int g = 17;
4. int y = g;
5. y = y + 10;
6. short s;
7. s = y;
8. byte b = 3;
9. byte v = b;
10. short n = 12;
11. v = n;
12. byte k = 128;
3) Date liniile de cod de mai jos, determinați câte referințe active, referințe nule, obiecte accesibile și
obiecte inaccesibile sunt. Justificați răspunsul.
Indicație: vezi exemplul prezentat în laborator la punctul 3. Primitive și referințe.
Carte b = new Carte ( );
Carte c = new Carte ( );
b = c;
c = null;
4) Ce diferență este între variabilele de instanță și variabilele locale în ceea ce privește valorile implicite?
5) Care credeți că sunt avantajele utilizării pachetelor în Java?

7. Temă pentru acasă

1) De la ce vine ‘x’ din numele javax?

 
 
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)

 
 

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