Lekcje modułu (1/2)
Dziedziczenie
Dziedziczenie to fundamentalny mechanizm programowania zorientowanego obiektowo (OOP), który pozwala jednej klasie (zwanej klasą pochodną lub podklasą) dziedziczyć pola i metody z innej klasy (zwanej klasą bazową lub superklasą).
Sprzyja to ponownemu użyciu kodu i zapobiega niepotrzebnemu powtarzaniu tych samych struktur.
Rozszerzanie Klasy za Pomocą extends
W Javie używamy słowa kluczowego extends, aby wskazać, że jedna klasa dziedziczy po drugiej:
class Vehicle {
protected int speed; // 'protected' rende il campo visibile alle sottoclassi
public void honk() {
System.out.println("Beep beep!");
}
}
class Car extends Vehicle {
// Car eredita automaticamente il campo speed e il metodo honk()
}
Konstruktor i Słowo Kluczowe super()
Jeśli superklasa posiada konstruktor przyjmujący parametry, podklasa musi go jawnie wywołać w swoim konstruktorze za pomocą super(...) jako pierwszą instrukcję:
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); // Richiama il costruttore di Person
this.studentId = studentId;
}
}
Nadpisywanie Metod (@Override)
Podklasa może dostarczyć własną specyficzną implementację metody odziedziczonej po superklasie. Operacja ta nazywa się nadpisywaniem (method overriding) i jest oznaczana adnotacją @Override.
class Animal {
public void makeSound() {
System.out.println("Rumore generico");
}
}
class Cat extends Animal {
@Override
public void makeSound() {
System.out.println("Miao!");
}
}
Modyfikator protected
Modyfikator dostępu protected odgrywa kluczową rolę w dziedziczeniu. W przeciwieństwe do private, który sprawia, że składowe klasy są widoczne tylko w jej obrębie, protected pozwala na dostęp do pól i metod zarówno w obrębie tego samego pakietu (package), jak i przez wszystkie podklasy, nawet jeśli znajdują się w innych pakietach.
Dostęp do Składowych Klasy Bazowej za Pomocą super
Oprócz wywoływania konstruktora superklasy, słowo kluczowe super może być używane wewnątrz metod podklasy do odwoływania się do metod lub zmiennych klasy bazowej. Jest to szczególnie przydatne, gdy metoda została nadpisana, ale wciąż chcemy wywołać oryginalne zachowanie klasy nadrzędnej:
class Animal {
public void sleep() {
System.out.println("Zzz");
}
}
class Cat extends Animal {
@Override
public void sleep() {
super.sleep(); // Esegue il comportamento di Animal
System.out.println("Il gatto fa le fusa mentre dorme.");
}
}
Dziedziczenie Jednorodne w Javie
W Javie klasa może rozszerzać tylko jedną klasę (dziedziczenie jednorodne / pojedyncze). Bezpośrednie dziedziczenie po wielu klasach (dziedziczenie wielokrotne) jest niedozwolone — na przykład zapis class Cat extends Animal, Mammal wygeneruje błąd. Taka decyzja projektowa pozwala uniknąć dwuznaczności znanych jako „problem diamentu” (gdy dwie superklasy definiują tę samą metodę z różnymi implementacjami). Aby obejść to ograniczenie, Java wprowadza pojęcie Interfejsów, które poznamy w kolejnym module.
Spróbuj sam
Uzupełnij podklasę Dog rozszerzając klasę Animal. Zadeklaruj konstruktor klasy Dog, który przyjmuje imię (String) i używa instrukcji super(name), aby przekazać je do konstruktora Animal.
Pokaż wskazówkę
Napisz `public Dog(String name) { super(name); }` wewnątrz klasy Dog.
Rozwiązanie dostępne po 3 próbach
Rozszerz klasę Dog po klasie Animal i nadpisz metodę makeSound() tak, aby zwracała napis Woof zamiast Generic Sound. Użyj adnotacji @Override.
Pokaż wskazówkę
Napisz `@Override` nad deklaracją `public String makeSound() { return 'Woof'; }` w klasie Dog.
Rozwiązanie dostępne po 3 próbach
Zadeklaruj klasę Cat, która rozszerza Animal i nadpisuje metodę makeSound() tak, aby zwracała napis Meow. Klasa Animal ma już konstruktor przyjmujący imię — upewnij się, że konstruktor klasy Cat również przyjmuje imię i poprawnie przekazuje je do konstruktora superklasy.
Pokaż wskazówkę
Utwórz klasę `Cat` rozszerzającą `Animal`. Zadeklaruj konstruktor `public Cat(String name) { super(name); }` i nadpisz metodę `makeSound()` za pomocą `@Override`, aby zwracała napis `'Meow'`.
Rozwiązanie dostępne po 3 próbach