Sunteți pe pagina 1din 3

Tehnologii Avansate de Programare , Limbajul Java, 2019 CEITI

Tema5. Moștenire. Clase de bază, clase derivate.


Ce este moștenirea în context POO?
Moștenirea este unul din principiile POO şi reprezintă inima acesteia. Conform acestui principiu
dintr-o clasă de bază pot fi derivate mai multe clase şi fiecare clasă derivată poate deveni la rândul
ei o clasă de bază pentru alte clase derivate. Se poate astfel realiza o ierarhie de clase, care să
modeleze sisteme complexe.
Construirea ierarhiei de clase constituie activitatea fundamentală de realizare a unei aplicaţii
orientate obiect.
Fie că avem de creat clasele Dreptunghi, Patrat, Romb. Aceste clase au multe trăsături comune
(număr de unghiuri, număr de laturi, culoare, ș.a). Folosind conceptul de moștenire vom putea
implementa aceste clase ca să fie ușor de înțeles, menținut şi fără cod duplicat. Moștenirea ne
permite să proiectăm o clasă generală (superclasă, clasă de bază, clasă părinte), de exemplu clasa
Paralelogram, care să poată fi extinsă mai târziu pentru a crea clase specifice (subclase, clase copil,
clase derivate), de exemplu clasele Dreptunghi, Romb, Triunghi. Clasa nouă va moșteni toate
atributele şi metodele clasei de bază, având posibilitatea de a avea metode şi atribute proprii.

Cum realizăm moștenirea în Java?


După cum am menționat la lecțiile anterioare în Java poate fi implementată doar moștenirea
simplă, adică o clasă poate avea o singură superclasă sau clasă părinte.
Pentru a deriva o clasă se folosește cuvântul cheie extends în semnătura clasei copil, urmată de
numele clasei părinte.
Să ne reamintim sintaxa de declarare a claselor:
[public][abstract][final] class nume_clasa
[extends nume_super_clasă]
[implements Interfata1,Interfata2,...,InterfataN]
{// atribute, metode, blocuri de cod, alte clase
}
De exemplu: Definiți clasa Angajat caracterizată de următoarele atribute: nume, prenume, salariu.
Derivați din clasa Angajat clasa Manager caracterizată de atributele: nume, prenume, salariu și
virsta.
class Angajat { class Manager extends Angajat{
String nume; int virsta;
String prenume; }
int salariu;
}

Cum se rezolvă problema moștenirii multiple?


Deoarece în Java moștenirea multiplă nu poate fi implementată aceasta poate fi simulată folosind
interfețele (detalii la tema ,,Interfețe”). Deasemenea moștenirea multiplă ar putea fi simulată în felul
următor:
- clasa A este părinte al clasei B A

- clasa B este părinte al clasei C B

- clasa C este părinte al clasei D, etc C

etc
opreavictoria86@gmail.com © MUSTEAȚĂ Victoria
1
Tehnologii Avansate de Programare , Limbajul Java, 2019 CEITI
În acest moment clasa D știe să facă tot ce știe să facă C, care știe să facă tot ce face clasa B, care
știe sa facă tot face clasa A. În aceste condiții printr-un mecanism de moștenire în trepte putem să
ajungem la clase cu cod relativ mic, însă care au foarte multe metode moștenite.
1. Java permite doar moștenire simplă, o clasă poate extinde o singură clasă şi numai una.
2. Prin moștenire o subclasă preia tot comportamentul unei clase părinte.
3. O clasă părinte poate avea orice număr de subclase.
4. Clasa Object este singura clasă în Java care nu are clasă părinte , şi este părintele tuturor
Rețineți !

claselor.
5. O subclasă moștenește de la clasa părinte toate atributele şi metodele care nu sunt
private.
6. Prin extinderea unei clase permitem reutilizarea codului.
7. Constructorii NU pot fi moșteniți.

Cînd se utilizează variabila predefinită super?


Folosim variabila predefinită super în următoarele cazuri:
1) pentru a referi o variabilă din clasa părinte: super.<nume_variabila>
class ClasaParinte{
int num=100;
}
class Subclasa extends ClasaParinte{
int num=110;
void printNumber(){
System.out.println(super.num);
}
public static void main(String args[]){
Subclasa obj= new Subclasa ();
obj.printNumber();
}
}
2) pentru apelarea constructorului clasei părinte: super([lista_argumente])
a) apelul constructorului fără argumente din superclasă:
class Clasa_Parinte {
Clasa_Parinte(){
System.out.println("Constructorul Superclasei ");
}
}

class Subclasaa extends Clasa_Parinte {


Subclasaa(){
super();
System.out.println("Constructorul Subclasei ");
}
void afiseaza(){
System.out.println("Salut! ");
}
public static void main(String args[]){
Subclasaa obj= new Subclasaa();
obj.afiseaza();
}
}

b) apelul constructorului cu argumente din superclasă:


opreavictoria86@gmail.com © MUSTEAȚĂ Victoria
2
Tehnologii Avansate de Programare , Limbajul Java, 2019 CEITI
class Persoana{
protected String nume, prenume;
protected int virsta;
Persoana (String nume, String prenume, int virsta){
this.nume = nume;
this.prenume = prenume;
this.virsta = virsta;
}
void detalii() {
System.out.print(" Nume "+nume+" Prenume "+ prenume+" Virsta "+virsta);
}
}
class Elev extends Persoana{
private String adresa;
private double media;
Elev(String nume, String prenume, int virsta, String adresa, double media ){
super(nume, prenume, virsta);
this.adresa = adresa;
this.media = media;
}
void detalii() {
super.detalii();
System.out.println(" Adresa "+adresa+" Media "+ media);
}
}
public class Test_mostenire {
public static void main(String[] args) {
Elev e1 = new Elev("Creanga", "Ion", 16, "str. Sarmizegetusa 48", 9.5);
e1.detalii();
}
}

3) pentru a forța apelarea unei metode din cadrul unei clase părinte: super.<method_name>
class Persoana {
String nume;
void afiseaza(){ System.out.println("Nume="+nume); }
}
class Angajat extends Persoana{
int venit;
void afiseaza(){
super.afiseaza();
System.out.println("Venit="+venit);
}}

1. Apelul variabilei super() trebuie să fie prima instrucțiune din corpul constructorului
subclasei.
Rețineți !

2. Dacă un constructor nu va invoca explicit constructorul superclasei, compilatorul Java va


însera automat un apel la constructorul clasei fără parametri. Dacă superclasa nu are
constructor fără argumente veți obține eroare de compilare.
Surse:
1. C.Marinescu, P.F.Mihancea , POO în Java , Editura Politehnica Timisoara,2006, Lecţia 5, pag.70
2. T.Sorin, V. Tudor , Bazele programării în Java , Lecția 5, pag.132
3. C.Frăsinaru , Curs Practic de Java , pag.41
4. Y. Daniel Liang , Introduction to Java Programming, 9th edition, pag.408
5. https://www.w3resource.com/java-tutorial/inheritance-composition-relationship.php

opreavictoria86@gmail.com © MUSTEAȚĂ Victoria


3

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