Sunteți pe pagina 1din 6

Laborator 3 Programare III

săptămâna 14 - 19.10.2019

OBIECTIVE: - Folosirea modificatorilor unei clase (public, abstract, final)


- Folosirea modificatorilor de acces în declaraţiile membrilor unei clase
Noţiuni:
• declarare clase
• metode
• modificatori de clasa, modificatori de atribute şi modificatori metode
• constructori

Începând din acest laborator:

• Comentați și formatați corespunzător codul sursă


• Utilizați convenţiile de scriere a codului pentru limbajul Java:
http://www.oracle.com/technetwork/java/codeconv-138413.html
• Utilizați documentația:
o Java 1.7 API Specification: http://docs.oracle.com/javase/7/docs/api/

Documentarea codului sursă

Comentarii de clasă

Comentariile de clasă pot conţine o descriere a rolului clasei şi pot include informaţii despre
autor, versiune, versiunea aplicaţiei în care au fost create.
Exemplu:
/**
* Clasa care gestioneaza datele despre o locuinta. Clasa contine o descriere a
* unei locuinte dar si metode de calcul a diferiti indicatori.
*
* @author Popescu Ion
* @version 1.0
* @since v-2.2
*
*/
public class Locuinta {

}

Comentarii metodă

Comentariile de metode pot conţine informaţii despre: rolul metodei, parametrii metodei,
valoarea de return, excepţiile pe care le aruncă metoda.
Exemplu:
/**
* Metoda care calculeaza eficienta energetica a unei cladiri pe baza
* tipului grilei de calcul.
*
* @param grila
1
* - tipul grilei de calcul
* @return coeficientul de eficienta energetica
*/
public float eficientaEnergetia(int grila) {
return 0;
}

Generare documentaţie folosind utilitarul javadoc în Eclipse

Documentaţi se generează în format HTML cu ajutorul utilitarului javadoc. În Eclipse putem


genera documentaţia selectând Project/Generate Javadoc …

Mai multe detalii despre specificarea comentariilor găsiţi la:


http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html

Probleme laborator

1. Să se creeze o clasă Carte care are următoarele atribute: titlu (public), autor (privat),
isbn(public), an apariţie(privat), număr pagini(package). Pentru clasa Carte să se
definească:
a. Trei constructori: unul fără parametrii (implicit), unul cu trei parametri și unul
care conţine toate atributele clasei
b. Metode de setare şi obţinere a valorilor variabilelor ( set, get )
c. O metodă de afişare a câmpurilor clasei Carte (metoda are prototipul public
String toString() ).
d. Realizaţi unui program pentru a testa metodele adăugate la cerinţele
anterioare

2. Fie clasa Cântec care are următoarele atribute: titlu, compozitor, interpret, durată (în
secunde). Atributele durată şi interpret sunt private, iar atributele titlu şi compozitor
sunt publice.
a. Să se scrie un constructor implicit şi unul cu toate atributele
b. Să se scrie metode de setare şi obţinere a atributelor titlu şi durată
c. Să se scrie o metodă de afişare
d. Să se scrie o metodă care transformă durata din secunde în milisecunde
e. Realizaţi un program pentru testarea metodele adăugate la cerinţele anterioare

3. La exemplul de la exerciţiul 2 adăugaţi următoarele:


a. O constantă pentru durata minimă a unui cântec.
b. Modificaţi metoda de setare a duratei unui cântec astfel încât să nu se poată
seta cu o valoare mai mică decât cea specificată în constantă
c. Modificaţi clasa de mai sus astfel încât valoarea iniţială a duratei să fie cea
setată constanta de la punctul a)
d. Adăugaţi o metodă care vă permite să număraţi câte instanţe de cântece au
fost create în programul de test.

2
4. Să se definească o clasa Complex care să modeleze lucrul cu numere complexe.
Membrii acestei clase vor fi:

• 2 variabile de tip double pentru partea reală, respectiv imaginară a numărului


complex ;
• un constructor cu 2 parametri de tip double pentru iniţializarea celor 2
variabile ;
• un constructor cu un parametru de tip double, care reprezintă partea reală a
numărului;
• o metodă de calcul al modulului unui număr complex. Modulul unui număr
complex este , unde re este partea reală, iar im este partea imaginară a
numărului complex. Pentru calculul radicalului se va folosi metoda statică
sqrt() din clasa Math, care necesită un parametru de tip double şi returnează
un rezultat de tip double ;
• o metodă de afişare pe ecran a valorii unui număr complex, sub forma:

parte_reala + i*parte_imaginara

• o metodă statică numită suma() care să accepte ca parametri 2 numere


complexe şi care să returneze suma lor, sub formă de număr complex
• o metodă statică numită produs() care să accepte ca parametri 2 numere
complexe şi care să returneze produsul lor, sub formă de număr complex.

Pe lângă clasa Complex se va defini o clasă ClientComplex care va conţine exemple


de utilizare pentru metodele clasei Complex.

TEMA – TERMEN 26.10.2019

1. Definiţi o clasă Ochelari care are ca atribute: producător, preţ şi tip ochelari. Pentru
clasa Ochelari definiţi următoarele metode:
a) un constructor implicit (fără parametri)
b) un constructor cu 2 şi unul cu 3 parametrii
c) o funcţie statică de comparare a două perechi de ochelari
d) o funcţie membră care permite creşterea preţului unei perechi de ochelari cum un
procent x
e) o metodă de afişare a unei perechi de ochelari
Ob.
• Definiţi o clasă sau enumerare care conţine valorile pe care le poate lua
atributul tip ochelari (soare, vedere).
• Pentru a exemplifica metodele definite creaţi o nouă clasă.
• Validaţi atributele claselor, de exemplu preţul să fie pozitiv sau tipul
ochelarilor să aparţină mulţimi de valori valide.

2. Să se scrie o clasă Java care să ușureze lucrul cu matrici de dimensiune oarecare (n x


m), având elemente numere reale. Clasa Matrice definiţi următoarele funcţii:

3
a. Constructori care vor primi matrici sub diferite forme (tablouri
unidimensionale, bidimensionale).
b. Metode de afișare a unui element de la o anumită poziție, afișarea unei linii,
afişarea unei coloane.
c. O metodă statică de adunare a două matricii.
d. Metode de înmulțirea a unei matricii cu altă matrice sau cu un scalar.
e. Metodă de calcul a transpusei matricii curente.
f. Exemplificaţi modul de utilizare a metodelor de mai sus.

Metode moştenite din Clasa Object

Clasa Object declară un număr de metode care pot fi suprascrise de subclase ale ei
(aceasta înseamnă că în orice aplicaţie putem suprascrie aceste metode). Când implementam
o clasa trebuie sa ţinem cont de unele aspecte legate de obiectele instanţă (cum trebuie
copiate <cloned>, comparate, şterse, afişate sub forma unui String). Putem suprascrie aceste
metode atunci când comportamentul lor implicit nu satisface cerinţele programului.

Următoarele metode pot fi supraîncărcate:

public boolean equals(Object obj);


public String toString();
public final native int hashCode();
protected native Object clone();
protected void finalize();

Obs: obiectele de tip array permit de asemenea suprascrierea acestor metode.

Trei dintre aceste metode sunt publice şi pot fi suprascrise de orice clasă, în timp ce două
metode sunt protejate şi din acest motiv trebuie declarate publice în momentul în care sunt
suprascrise.

boolean equals(Object obj)

Metoda folosită pentru a compara două obiecte (obiectul pentru care se apelează metoda
şi obiectul transmis ca parametru).

Metoda implicita oferita de clasa Object returnează true dacă cele doua obiecte reprezintă
de fapt acelaşi obiect, folosindu-se operatorul = = .
Rămâne în sarcina programatorului sa decidă cum se compara doua obiecte ale aceleiaşi
clase.
Documentaţia JDK defineşte un set riguros de reguli ce trebuie avute in vedere atunci
când se doreşte stabilirea egalităţii între doua obiecte. Metoda equals() implementează o
relaţie de echivalenta:
• Este reflexiva ;

4
• Este simetrica;
• Este tranzitiva;

String toString()

Metoda returnează o reprezentare de tip String pentru obiectul care o apelează. Implicit
returneaza un Sring sub forma: ClassName @ 1cc7a0, adică numele clasei urmat de
caracterul @ si apoi o valoare in hexa a codului hash.
Pentru a genera o reprezentare mult mai utila putem supraîncărca acesta metodă şi returna
orice String care sa ne ofere informaţii despre obiect.

int hashCode()

Un hash cod este o valoare întreaga ce reprezintă întreaga valoare a unui obiect. Codurile
hash sunt folosite drept chei în tabelele de dispersie aşa cum este implementata clasa
HashTable din pachetul java.util. Versiunea implicita a metodei va încerca să genereze un
cod pentru fiecare obiect dar se poate ca la un moment dat sa genereze valori diferite pentru
un acelaşi obiect. Dacă se întâmplă acest lucru atunci trebuie sa suprascriem metoda pentru a
implementa o noua funcţie de dispersie (hash function) care va genera codurile hash corecte.

De fiecare dată când este invocata metoda hashCode() asupra aceluiaşi obiect ea trebuie
să returneze în mod constant aceeaşi valoare întreagă. Dacă două obiecte sunt egale conform
metodei equals(), atunci apelând metoda hashCode() pentru fiecare din cele două obiecte
trebuie sa obţinem aceeași valoare întreaga.
Programatorii se bazează de obicei pe implementarea implicita a metodei hashCode()
decât sa implementeze o noua versiune (ceea ce poate duce la o munca destul de dificila).

object clone()

Metoda va crea o copie a obiectului. Implicit doar obiectul curent este copiat şi nu şi
celelalte obiecte spre care acesta poate avea referinţe. Valorile primitive în Java sunt
întotdeauna copiate. Metoda suprascrisa trebuie declarata public. Dacă un obiect nu poate fi
clonat va fi aruncata excepţia : CloneNotSupportedException.

void finalize()

Această metodă este apelată automat de colectorul de gunoi (garbage collector) când un
obiect nu mai este referențiat şi poate fi şters din memorie. Varianta implicită nu conține nici
o instrucţiune în corpul metodei. Colectorul de gunoaie poate rula oricând, astfel încât nu se
poate determina cu exactitate când va fi apelată metoda finalize(). Putem supraîncărca
această metodă în cazul în care de exemplu anumite date trebuie salvate într-un fişier înainte
de a fi pierdute sau o conexiune pe reţea trebuie închisă.

5
Dacă apare o eroare metoda poate folosi în declaraţie şi clauza throw, aruncând o
excepţie de tipul Throwable. Dacă această excepţie este aruncată atunci ea va fi prinsă de
colectorul de gunoi şi ignorată, lăsând programul să-şi desfăşoare execuţia până la final.

Metoda toString()

De multe ori este necesar ca datele conţinute de obiecte să fie convertite la şiruri de caractere
în vederea participării obiectelor respective ca operanzi în expresii de manipulare a
stringurilor. De exemplu funcţiile print/println necesită ca parametru o referinţă String.
Convertind un obiect la String, am putea să "afişăm" acel obiect cu ajutorul funcţiilor
print/println.
Problema se rezolvă astfel:
Dacă intr-o clasă este definită o metodă având semnătura:
public String toString( );
atunci referinţele la obiectele clasei respective pot să apară ca operanzi in operaţii de
concatenare de şiruri, deoarece în aceste situaţii se apelează automat metoda toString().
Deci, programatorul trebuie să-şi definească în clasele sale câte o metodă toString(), dacă
doreşte să convertească obiectele respective la stringuri.

Exemplu:
Class Punct {
//. . .
public String toString( ) {
String s = "("+String.valueOf(x)+","+y+")";
return s;
}
}
class ClientPunct {
public void oMetoda( ) {
Punct p1 = new Punct(1,2);
//. . .
System.out.println("Punctul p1="+p1);
}
//. . .
}

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