laborator9.pdf
TRANSCRIPT
ROMÂNIA
Universitatea Politehnica din Bucuresti
Facultatea de Antreprenoriat, Ingineria si Managementul Afacerilor
Programarea Calculatoarelor - Laboratorul 9
Responsabil: Şl.dr.ing. Bogdan Ţigănoaia, [email protected]
Obiectivele laboratorului sunt urmatoarele:
Prezentarea notiunii de mostenire
Lucrul cu ierarhii de clase in Java
1. Prezentarea notiunii de mostenire
Moștenirea permite definirea şi crearea unor clase specializate plecând de la clase (generale)
care sunt deja definite. Ea permite construirea unor clase noi, care păstrează caracteristicile şi
comportarea, deci datele şi funcţiile membru, de la una sau mai multe clase definite anterior,
numite clase de bază, fiind posibilă redefinirea sau adăugarea unor date şi funcţii noi.
O clasă ce moşteneşte una sau mai multe clase de bază se numeşte clasa derivată.
Atat variabilele, cat si metodele pot fi statice sau nestatice.
1
Proprietatea de moştenire: proprietatea claselor prin care o clasă nou construită poate prelua
datele şi metodele clasei mai vechi.
Clasa derivată se află întotdeauna pe un nivel imediat inferior celui corespunzător clasei de
bază.
În Java există doar moştenire simplă, o ierarhie de clase în care fiecare clasă derivată are o
singură clasă de bază.
Exemplu:
Paralelogram
Dreptunghi Romb
Pătrat
Clasa dreptunghi este o clasă derivată (subclasă) a clasei paralelogram, iar clasa
paralelogram este o clasă de bază (supraclasă) a clasei dreptunghi. Astfel, o ierarhie de
concepte conduce la o ierarhie între clasele care implementează conceptele ierarhice
respective.
2. Lucrul cu ierarhii de clase in Java
Unul dintre avantajele oferite de tehnologia POO este posibilitatea de a extinde
comportamentul unei clase existente prin definirea unei clase noi care mosteneste
continutul primei clase, adaugand la acesta elemente specifice.
Clasa existenta, care va fi mostenita se mai numeste clasa de baza sau superclasa. Clasa care
realizeaza extinderea se numeste subclasa, clasa derivata sau clasa descendenta.
2
Relatia de mostenire este o relatie de forma "este un fel de", adica subclasa "este un fel de"
superclasa. De altfel, daca se pune problema de a decide daca o anumita clasa trebuie sau
nu sa mosteneasca o alta clasa, decizia se va lua in functie de raspunsul la intrebarea: este
prima clasa "un fel de" cealalta clasa? Practic, relatia de mostenire intre clase este o
reflectare a ierarhizarii existente intre entitatile modelate de clasele respective.
Pentru a specifica faptul ca o subclasa mosteneste o clasa de baza, in Java se utilizeaza
urmatoarea constructie:
class nume_subclasa extends nume_superclasa {
//continut specific subclasei
}
In ceea ce priveste gradul relatiei de mostenire, in Java: o subclasa poate extinde o singura
superclasa, adica avem de a face cu mostenire simpla; aceeasi superclasa poate fi extinsa de
mai multe subclase distincte.
O subclasa, la randul ei, poate constitui superclasa pentru o alta clasa. O clasa de baza
impreuna cu toate descendentele ei formeaza o ierarhie de clase.
In metodele unei subclase pot fi referiti acei membri mosteniti care in superclasa au fost
precedati de modificatorii protected sau public. Referirea membrilor mosteniti se face
direct la fel ca si pentru membrii specifici. Acest lucru este foarte normal, deoarece si
membrii mosteniti sunt continuti in subclasa, doar ca ei nu au fost declarati explicit.
Includerea lor se face automat, ca efect al clauzei extends.
3
In clientii unei subclase pot fi referiti acei membri, mosteniti sau locali, care sunt precedati
de modificatorul public. Membrii declarati ca protected sunt accesibili doar daca clientul se
afla in acelasi pachet cu subclasa respectiva.
Task 1: Compilati si rulati programul urmator
/**
* Clasa Student - derivata din clasa Persoana
*
*/
public class Student extends Persoana {
static int nr_ani = 5;
int an_studiu;
public Student(String numePers, String prenumePers,
int varstaPers, double inaltimeaPers, char sexPers) {
super(numePers, prenumePers, varstaPers, inaltimeaPers, sexPers);
an_studiu = 1;
}
public Student(String numePers, String prenumePers) {
super(numePers, prenumePers);
an_studiu = 1;
}
public void afiseazaInformatii() {
super.afiseazaInformatii();
System.out.println("Anul de studiu: "+an_studiu);
4
}
public static void main(String args[]) {
Student s1 = new Student("Dragos","Elena");
Persoana p1;
p1 = s1;
s1.afiseazaInformatii();
p1.afiseazaInformatii();
}
}
3. Taskuri
Task 2: Adaugati metode de citire de la tastatura si, respectiv afisare la consola a unei
persoane, respectiv a unui student. Metodele din clasa Student vor folosi apelul la
metodele de citire/scriere din clasa Persoana si vor adauga doar ce este necesar.
Task 3: Creati o noua clasa Angajat derivata din clasa Persoana, la care se vor adauga
atribute si metode specifice.
Bonus: Scrieti un program care citeste o serie de 5 persoane, le retine intr-un tablou si apoi
afiseaza datele despre ele prin parcurgerea liniara a tabloului. Pentru citire/afisare date se vor
apela metodele adaugate la Task2.
Bibliografie: http://www.opendrum.upt.ro/ , Note de curs Nirvana Popescu
5