Podstawy dziedziczenia (extends)
Część sekcji Programowanie obiektowe ścieżki Java w Coddy. Lekcja 20 z 87.
Dziedziczenie jest jednym z głównych filarów OOP. Umożliwia klasie przejęcie właściwości i metod innej klasy, co sprzyja ponownemu wykorzystaniu kodu i ustanawia naturalną hierarchię między klasami.
W Javie tworzysz relację dziedziczenia za pomocą słowa kluczowego extends. Klasa, która dziedziczy, nazywa się podklasą (lub klasą potomną), a klasa, po której dziedziczy, nazywa się nadklasą (lub klasą nadrzędną).
public class Animal {
private String name;
public Animal(String name) {
this.name = name;
}
public void eat() {
System.out.println(name + " is eating");
}
public String getName() {
return name;
}
}
public class Dog extends Animal {
public Dog(String name) {
super(name); // Wywołuje konstruktor klasy nadrzędnej
}
public void bark() {
System.out.println(getName() + " says woof!");
}
}Klasa Dog automatycznie dziedziczy metodę eat() i metodę getName() z klasy Animal. Może również definiować własne metody, takie jak bark():
Dog myDog = new Dog("Buddy");
myDog.eat(); // Odziedziczone: "Buddy is eating"
myDog.bark(); // Własna metoda: "Buddy says woof!"Pomyśl o dziedziczeniu jako o relacji „jest-czymś”. Pies jest Zwierzęciem, więc ma sens, by Dog rozszerzał Animal. Ta relacja pozwala tworzyć wyspecjalizowane klasy, które współdzielą wspólną funkcjonalność, a jednocześnie dodają własne, unikalne zachowania.
Wyzwanie
ŁatwyZbudujmy prosty system pojazdów, który pokazuje dziedziczenie w działaniu. Utworzysz klasę nadrzędną przechowującą wspólne właściwości pojazdów oraz klasę podrzędną, która ją rozszerza o specjalne zachowanie.
Rozmieścisz swój kod w trzech plikach:
Vehicle.java: Utwórz klasę nadrzędną reprezentującą dowolny pojazd. Powinna zawierać:- Prywatne pole dla
brandpojazdu (String) - Konstruktor, który przyjmuje nazwę marki i przypisuje ją do pola. (Nie trzeba tutaj wywoływać
super(), ponieważ Vehicle znajduje się na szczycie hierarchii.) - Metodę
getBrand(), która zwraca markę - Metodę
start(), która wyświetla:[brand] is starting
- Prywatne pole dla
Motorcycle.java: Utwórz podklasę rozszerzającą Vehicle. Motocykl jest pojazdem, więc ta relacja „jest-czymś” sprawia, że dziedziczenie jest odpowiednim rozwiązaniem. Twoja klasa Motorcycle powinna:- Użyć
extends, aby dziedziczyć po Vehicle - Mieć konstruktor, który przyjmuje markę i przekazuje ją klasie nadrzędnej za pomocą
super(brand) - Dodać własną metodę
wheelie(), która wyświetla:[brand] is doing a wheelie!
- Użyć
Main.java: Połącz wszystko, tworząc obiekt Motorcycle i pokazując zarówno odziedziczone, jak i unikalne zachowania. Otrzymasz jedno wejście: nazwę marki. Wyświetl dwa wiersze, wywołując:- Odziedziczoną metodę
start() - Własną metodę Motorcycle
wheelie()
- Odziedziczoną metodę
Otrzymasz jedno wejście: nazwę marki (String) swojego motocykla.
Zauważ, że Motorcycle automatycznie ma dostęp do metod start() i getBrand() bez ich ponownego pisania — na tym polega siła dziedziczenia!
Spróbuj swoich sił
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String brand = scanner.nextLine();
// TODO: Utwórz obiekt Motorcycle z podaną marką
// TODO: Wywołaj odziedziczoną metodę start()
// TODO: Wywołaj metodę wheelie()
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneWprowadzenie do programowania obiektowegoKlasy a obiektySłowo kluczowe thisMetodyPola (atrybuty)Metoda konstruktoraPrzeciążanie konstruktoraPodsumowanie — prosty kalkulator4Dziedziczenie
Podstawy dziedziczenia (extends)Słowo kluczowe superPrzesłanianie metod (@Override)Łańcuch wywołań konstruktorówKlasa ObjectDziedziczenie jedno- i wielopoziomoweDlaczego Java nie obsługuje wielodziedziczenia klasPodsumowanie – hierarchia pracowników7Metody specjalne i klasa Object
Metoda toString()equals() i hashCode()Metoda clone()compareTo() i ComparableInterfejs ComparatorPodsumowanie — własne sortowanie10Obsługa wyjątków w programowaniu obiektowym
Hierarchia klas wyjątkówWłasne wyjątkiBłędy sprawdzane a niesprawdzaneWzorzec try-with-resourcesPodsumowanie – zweryfikowany użytkownik2Modyfikatory dostępu i enkapsulacja
Przegląd poziomów dostępuMetody pobierające i ustawiająceUkrywanie informacjiSłowo kluczowe finalPodsumowanie — menedżer kont bankowych5Polimorfizm
Podstawy przeciążania metodPrzesłanianie metod (w czasie wykonywania)Rzutowanie w górę i w dółOperator instanceofKlasy i metody abstrakcyjnePowtórka — kalkulator figur8Zaawansowane koncepcje OOP
Kompozycja a dziedziczenieAgregacja a kompozycjaKlasy wewnętrzne, zagnieżdżone i anonimoweEnumy i metody enumówRekordy (Java 16+)Klasy zapieczętowane (Java 17+)11Wzorce projektowe — część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec BuilderWzorzec ObserverWzorzec Strategy3Właściwości klas i składowe statyczne
Zmienne instancji a zmienne statyczneMetody statyczneBloki statyczneStałe (static final)Powtórka – Counter i Utility6Interfejsy i klasy abstrakcyjne
Wprowadzenie do interfejsówImplementowanie interfejsówImplementacja wielu interfejsówMetody domyślne i statyczne w interfejsieKlasy abstrakcyjne a interfejsyInterfejsy funkcyjnePodsumowanie — system płatnościPoćwicz samodzielnie: Kompilator Java online