Salt la conținutul principal
Modulul 3 · Lecția 1 din 25/14 în curs~12 min
Lecții din modul (1/2)

Moștenirea

Moștenirea este un mecanism fundamental al POO care permite unei clase (numite clasă sau subclasă copil) să moștenească câmpuri și metode de la o altă clasă (numită clasă părinte sau superclasă).

Acest lucru promovează reutilizarea codului și evită repetarea inutilă.

Extinderea unei clase cu extends

În Java, folosim cuvântul cheie extends pentru a indica faptul că o clasă moștenește de la alta:

Java
class Vehicle {
    protected int speed; // 'protected' makes the field visible to subclasses

    public void honk() {
        System.out.println("Beep beep!");
    }
}

class Car extends Vehicle {
    // Car automatically inherits the speed field and the honk() method
}

Constructorul și cuvântul cheie super()

Dacă superclasa are un constructor care acceptă parametri, subclasa trebuie să-l apeleze explicit în constructorul său folosind super(...) ca prima declarație:

Java
class Person {
    String name;

    public Person(String name) {
        this.name = name;
    }
}

class Student extends Person {
    int studentId;

    public Student(String name, int studentId) {
        super(name); // Invokes the constructor of Person
        this.studentId = studentId;
    }
}

Suprascrierea metodei (@Override)

O subclasă poate furniza propria sa implementare specifică pentru o metodă moștenită de la superclasă. Această operație se numește overriding (overriding metoda) și este indicată de adnotarea @Override.

Java
class Animal {
    public void makeSound() {
        System.out.println("Rumore generico");
    }
}

class Cat extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Miao!");
    }
}

Modificatorul protected

Modificatorul de acces protected joacă un rol cheie în moștenire. Spre deosebire de private, care face membrii vizibili doar în cadrul aceleiași clase, protected permite accesul la câmpuri și metode atât din cadrul aceluiași pachet, cât și de către toate subclasele, chiar dacă acestea rezidă în pachete diferite.

Accesarea membrilor părinți cu super

Pe lângă apelarea constructorului de superclasă, cuvântul cheie super poate fi folosit în cadrul metodelor de subclasă pentru a face referire la metode sau variabile ale clasei părinte. Acest lucru este util în special atunci când o metodă este suprascrisă, dar doriți totuși să invocați comportamentul părinte inițial:

Java
class Animal {
    public void sleep() {
        System.out.println("Zzz");
    }
}

class Cat extends Animal {
    @Override
    public void sleep() {
        super.sleep(); // Executes the behavior of Animal
        System.out.println("The cat purrs while sleeping.");
    }
}

Moștenire unică în Java

În Java, o clasă se poate extinde doar o clasă (moștenire unică). Moștenirea directă din mai multe clase (moștenire multiplă) nu este permisă; de exemplu, class Cat extends Animal, Mammal va provoca o eroare de compilare. Această alegere de proiectare evită ambiguitățile cunoscute sub numele de „problema diamantului” (când două superclase definesc aceeași metodă cu implementări diferite). Pentru a depăși această limitare, Java introduce conceptul de Interfețe, pe care îl vom explora în modulul următor.


Încercați-l singur

Exercițiu#java.m3.l1.e1
Încercări: 0Se încarcă…

Completați subclasa Câine extinzând Animal. Declarați constructorul Dog care acceptă un nume (String) și folosește super(nume) pentru a-l transmite constructorului Animal.

Se încarcă editorul...
Afișează indiciu

Scrie `public Dog(String name) { super(nume); }` în cadrul clasei de câini.

Soluție disponibilă după 3 încercări

Exercițiu#java.m3.l1.e2
Încercări: 0Se încarcă…

Extindeți Dog din Animal și suprascrieți metoda makeSound() astfel încât să returneze șirul Woof în loc de Generic Sound. Utilizați adnotarea @Override.

Se încarcă editorul...
Afișează indiciu

Scrieți `@Override` deasupra declarației `public String makeSound() { return 'Woof'; }` în interiorul Câinelui.

Soluție disponibilă după 3 încercări

Exercițiu#java.m3.l1.e3
Încercări: 0Se încarcă…

Declarați o clasă Cat care extinde Animal și suprascrie metoda makeSound() pentru a returna șirul Meow. Clasa Animal are deja un constructor care acceptă un nume; asigurați-vă că constructorul Cat acceptă și un nume și îl transmite corect constructorului de superclasă.

Se încarcă editorul...
Afișează indiciu

Creați clasa `Cat` care extinde `Animal`. Declara constructorul `public Cat(Nume sir) { super(nume); }` și suprascrieți metoda `makeSound()` folosind `@Override` pentru a returna `'Meow'`.

Soluție disponibilă după 3 încercări