Przejdź do głównej treści
eLearner.app
Moduł 3 · Lekcja 1 z 25/14 w kursie~12 min
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:

Code
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ę:

Code
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.

Code
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:

Code
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

Ćwiczenie#java.m3.l1.e1
Próby: 0Ładowanie...

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.

Ładowanie edytora...
Pokaż wskazówkę

Napisz `public Dog(String name) { super(name); }` wewnątrz klasy Dog.

Rozwiązanie dostępne po 3 próbach

Ćwiczenie#java.m3.l1.e2
Próby: 0Ładowanie...

Rozszerz klasę Dog po klasie Animal i nadpisz metodę makeSound() tak, aby zwracała napis Woof zamiast Generic Sound. Użyj adnotacji @Override.

Ładowanie edytora...
Pokaż wskazówkę

Napisz `@Override` nad deklaracją `public String makeSound() { return 'Woof'; }` w klasie Dog.

Rozwiązanie dostępne po 3 próbach

Ćwiczenie#java.m3.l1.e3
Próby: 0Ładowanie...

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.

Ładowanie edytora...
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