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:
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:
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.
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:
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
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.
Afișează indiciu
Scrie `public Dog(String name) { super(nume); }` în cadrul clasei de câini.
Soluție disponibilă după 3 încercări
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.
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
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ă.
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