Java, dziedziczenie jest ważnym filarem OOP (programowanie obiektowe). Jest to mechanizm w Javie, dzięki któremu jedna klasa może dziedziczyć cechy (pola i metody) innej klasy. W Javie dziedziczenie oznacza tworzenie nowych klas w oparciu o istniejące. Klasa dziedzicząca z innej klasy może ponownie używać metod i pól tej klasy. Ponadto możesz dodać nowe pola i metody do swojej bieżącej klasy.
Dlaczego potrzebujemy dziedziczenia Java?
- Możliwość ponownego wykorzystania kodu: Kod napisany w nadklasie jest wspólny dla wszystkich podklas. Klasy podrzędne mogą bezpośrednio używać kodu klasy nadrzędnej.
- Zastępowanie metody: Zastępowanie metody można osiągnąć jedynie poprzez dziedziczenie. Jest to jeden ze sposobów, w jaki Java osiąga polimorfizm czasu wykonywania.
- Abstrakcja: Koncepcję abstrakcji, w której nie musimy podawać wszystkich szczegółów, osiągamy poprzez dziedziczenie. Abstrakcja pokazuje tylko funkcjonalność użytkownikowi.
Ważne terminologie stosowane w dziedziczeniu Java
- Klasa: Klasa to zbiór obiektów, które mają wspólne cechy/zachowanie i wspólne właściwości/atrybuty. Klasa nie jest bytem ze świata rzeczywistego. To tylko szablon, projekt lub prototyp, z którego tworzone są obiekty.
- Superklasa/klasa rodziców: Klasa, której cechy są dziedziczone, nazywana jest nadklasą (lub klasą bazową lub klasą nadrzędną).
- Podklasa/klasa dziecięca: Klasa, która dziedziczy drugą klasę, nazywana jest podklasą (lub klasą pochodną, klasą rozszerzoną lub klasą podrzędną). Oprócz pól i metod nadklasy podklasa może dodawać własne pola i metody.
- Możliwość ponownego użycia: Dziedziczenie wspiera koncepcję ponownego wykorzystania, tj. gdy chcemy stworzyć nową klasę i istnieje już klasa zawierająca część potrzebnego nam kodu, możemy wyprowadzić naszą nową klasę z istniejącej klasy. W ten sposób ponownie wykorzystujemy pola i metody istniejącej klasy.
Jak korzystać z dziedziczenia w Javie?
The rozszerza słowo kluczowe służy do dziedziczenia w Javie. Użycie słowa kluczowego Extends wskazuje, że wywodzisz się z istniejącej klasy. Innymi słowy, rozszerzenie odnosi się do zwiększonej funkcjonalności.
filmy
Składnia:
class DerivedClass extends BaseClass { //methods and fields }>
Dziedziczenie w Javie – przykład
Przykład: W poniższym przykładzie dziedziczenia klasa Bicycle jest klasą bazową, klasa MountainBike jest klasą pochodną stanowiącą rozszerzenie klasy Bicycle, a klasa Test jest klasą sterownika uruchamiającą program.
Jawa // Java program to illustrate the // concept of inheritance // base class class Bicycle { // the Bicycle class has two fields public int gear; public int speed; // the Bicycle class has one constructor public Bicycle(int gear, int speed) { this.gear = gear; this.speed = speed; } // the Bicycle class has three methods public void applyBrake(int decrement) { speed -= decrement; } public void speedUp(int increment) { speed += increment; } // toString() method to print info of Bicycle public String toString() { return ('No of gears are ' + gear + '
' + 'speed of bicycle is ' + speed); } } // derived class class MountainBike extends Bicycle { // the MountainBike subclass adds one more field public int seatHeight; // the MountainBike subclass has one constructor public MountainBike(int gear, int speed, int startHeight) { // invoking base-class(Bicycle) constructor super(gear, speed); seatHeight = startHeight; } // the MountainBike subclass adds one more method public void setHeight(int newValue) { seatHeight = newValue; } // overriding toString() method // of Bicycle to print more info @Override public String toString() { return (super.toString() + '
seat height is ' + seatHeight); } } // driver class public class Test { public static void main(String args[]) { MountainBike mb = new MountainBike(3, 100, 25); System.out.println(mb.toString()); } }>
Wyjście
No of gears are 3 speed of bicycle is 100 seat height is 25>
W powyższym programie, gdy tworzony jest obiekt klasy MountainBike, kopia wszystkich metod i pól nadklasy przejmuje pamięć w tym obiekcie. Dlatego korzystając z obiektu podklasy możemy również uzyskać dostęp do członków nadklasy.
Należy pamiętać, że podczas dziedziczenia tworzony jest wyłącznie obiekt podklasy, a nie nadklasa. Więcej informacji znajdziesz w Tworzenie obiektu Java odziedziczonej klasy .
Przykład 2: W poniższym przykładzie dziedziczenia klasa Pracownik jest klasą bazową, klasa Inżynier jest klasą pochodną, która stanowi rozszerzenie klasy Pracownik, a klasa Test jest klasą sterownika uruchamiającą program.
Jawa // Java Program to illustrate Inheritance (concise) import java.io.*; // Base or Super Class class Employee { int salary = 60000; } // Inherited or Sub Class class Engineer extends Employee { int benefits = 10000; } // Driver Class class Gfg { public static void main(String args[]) { Engineer E1 = new Engineer(); System.out.println('Salary : ' + E1.salary + '
Benefits : ' + E1.benefits); } }>
Wyjście
Salary : 60000 Benefits : 10000>
Obraz ilustracyjny programu:

W praktyce dziedziczenie i wielopostaciowość są używane razem w Javie w celu osiągnięcia dużej wydajności i czytelności kodu.
Typy dziedziczenia Java
Poniżej znajdują się różne typy dziedziczenia obsługiwane przez Javę.
- Pojedyncze dziedzictwo
- Dziedziczenie wielopoziomowe
- Dziedziczenie hierarchiczne
- Dziedziczenie wielokrotne
- Dziedziczenie hybrydowe
1. Pojedyncze dziedzictwo
W dziedziczeniu pojedynczym podklasa pochodzi tylko z jednej nadklasy. Dziedziczy właściwości i zachowanie klasy z jednym rodzicem. Czasami nazywa się to również prostym dziedziczeniem. Na poniższym rysunku „A” jest klasą nadrzędną, a „B” jest klasą podrzędną. Klasa „B” dziedziczy wszystkie właściwości klasy „A”.

Pojedyncze dziedzictwo
Jawa // Java program to illustrate the // concept of single inheritance import java.io.*; import java.lang.*; import java.util.*; // Parent class class One { public void print_geek() { System.out.println('Geeks'); } } class Two extends One { public void print_for() { System.out.println('for'); } } // Driver class public class Main { // Main function public static void main(String[] args) { Two g = new Two(); g.print_geek(); g.print_for(); g.print_geek(); } }>
Wyjście
Geeks for Geeks>
2. Dziedziczenie wielopoziomowe
W dziedziczeniu wielopoziomowym klasa pochodna będzie dziedziczyć klasę bazową i oprócz klasy pochodnej działa również jako klasa bazowa dla innych klas. Na poniższym obrazku klasa A służy jako klasa bazowa dla klasy pochodnej B, która z kolei służy jako klasa bazowa dla klasy pochodnej C. W Javie klasa nie może bezpośrednio uzyskać dostępu do członkowie dziadków .

Dziedziczenie wielopoziomowe
Jawa // Importing required libraries import java.io.*; import java.lang.*; import java.util.*; // Parent class One class One { // Method to print 'Geeks' public void print_geek() { System.out.println('Geeks'); } } // Child class Two inherits from class One class Two extends One { // Method to print 'for' public void print_for() { System.out.println('for'); } } // Child class Three inherits from class Two class Three extends Two { // Method to print 'Geeks' public void print_lastgeek() { System.out.println('Geeks'); } } // Driver class public class Main { public static void main(String[] args) { // Creating an object of class Three Three g = new Three(); // Calling method from class One g.print_geek(); // Calling method from class Two g.print_for(); // Calling method from class Three g.print_lastgeek(); } }>
Wyjście
Geeks for Geeks>
3. Dziedziczenie hierarchiczne
W dziedziczeniu hierarchicznym jedna klasa służy jako nadklasa (klasa bazowa) dla więcej niż jednej podklasy. Na poniższym obrazku klasa A służy jako klasa bazowa dla klas pochodnych B, C i D.
// Java program to illustrate the // concept of Hierarchical inheritance class A { public void print_A() { System.out.println('Class A'); } } class B extends A { public void print_B() { System.out.println('Class B'); } } class C extends A { public void print_C() { System.out.println('Class C'); } } class D extends A { public void print_D() { System.out.println('Class D'); } } // Driver Class public class Test { public static void main(String[] args) { B obj_B = new B(); obj_B.print_A(); obj_B.print_B(); C obj_C = new C(); obj_C.print_A(); obj_C.print_C(); D obj_D = new D(); obj_D.print_A(); obj_D.print_D(); } }>
Wyjście
Class A Class B Class A Class C Class A Class D>
4. Dziedziczenie wielokrotne ( Poprzez interfejsy)
W Wiele spadków , jedna klasa może mieć więcej niż jedną nadklasę i dziedziczyć funkcje ze wszystkich klas nadrzędnych. Należy pamiętać, że Java to robi nie wsparcie wielokrotne spadki z zajęciami. W Javie wielokrotne dziedziczenie możemy osiągnąć tylko poprzez Interfejsy . Na poniższym obrazku klasa C wywodzi się z interfejsów A i B.

Dziedziczenie wielokrotne
Jawa // Java program to illustrate the // concept of Multiple inheritance import java.io.*; import java.lang.*; import java.util.*; interface One { public void print_geek(); } interface Two { public void print_for(); } interface Three extends One, Two { public void print_geek(); } class Child implements Three { @Override public void print_geek() { System.out.println('Geeks'); } public void print_for() { System.out.println('for'); } } // Drived class public class Main { public static void main(String[] args) { Child c = new Child(); c.print_geek(); c.print_for(); c.print_geek(); } }>
Wyjście
Geeks for Geeks>
5. Dziedziczenie hybrydowe
Jest to połączenie dwóch lub więcej powyższych typów dziedziczenia. Ponieważ Java nie obsługuje dziedziczenia wielokrotnego za pomocą klas, dziedziczenie hybrydowe obejmujące dziedziczenie wielokrotne również nie jest możliwe w przypadku klas. W Javie dziedziczenie hybrydowe możemy osiągnąć jedynie poprzez Interfejsy jeśli chcemy uwzględnić dziedziczenie wielokrotne, aby zaimplementować dziedziczenie hybrydowe.
Należy jednak pamiętać, że dziedziczenie hybrydowe niekoniecznie wymaga stosowania wyłącznie dziedziczenia wielokrotnego. Można to osiągnąć poprzez połączenie dziedziczenia wielopoziomowego i dziedziczenia hierarchicznego z klasami, dziedziczenia hierarchicznego i pojedynczego z klasami. Dlatego rzeczywiście możliwe jest zaimplementowanie dziedziczenia hybrydowego przy użyciu samych klas, bez polegania na typie dziedziczenia wielokrotnego.

Dziedziczenie hybrydowe
Java IS-rodzaj relacji
IS-A to sposób na powiedzenie: ten obiekt jest typem tego obiektu. Zobaczmy, jak słowo kluczowe Extends jest używane do osiągnięcia dziedziczenia.
Jawa public class SolarSystem { } public class Earth extends SolarSystem { } public class Mars extends SolarSystem { } public class Moon extends Earth { }>
Teraz, w oparciu o powyższy przykład, w kategoriach obiektowych, prawdziwe są następujące stwierdzenia:
tablica.z Java
- SolarSystem jest nadklasą klasy Earth.
- SolarSystem jest nadklasą klasy Mars.
- Ziemia i Mars są podklasami klasy SolarSystem.
- Moon jest podklasą klas Earth i SolarSystem.
class SolarSystem { } class Earth extends SolarSystem { } class Mars extends SolarSystem { } public class Moon extends Earth { public static void main(String args[]) { SolarSystem s = new SolarSystem(); Earth e = new Earth(); Mars m = new Mars(); System.out.println(s instanceof SolarSystem); System.out.println(e instanceof Earth); System.out.println(m instanceof SolarSystem); } }>
Wyjście
true true true>
Co można zrobić w podklasie?
W podklasach możemy dziedziczyć członków w niezmienionej postaci, zastępować ich, ukrywać lub uzupełniać nowymi członkami:
- Dziedziczonych pól można używać bezpośrednio, tak jak wszystkich innych pól.
- Możemy zadeklarować w podklasie nowe pola, które nie należą do nadklasy.
- Odziedziczonych metod można używać bezpośrednio w niezmienionej postaci.
- Możemy napisać nowy instancja w podklasie, która ma taką samą sygnaturę jak metoda w nadklasie nadrzędny to (jak w powyższym przykładzie, doString() metoda została nadpisana).
- Możemy napisać nowy statyczny w podklasie, która ma taką samą sygnaturę jak metoda w nadklasie ukrywanie To.
- W podklasie możemy zadeklarować nowe metody, których nie ma w nadklasie.
- Możemy napisać konstruktor podklasy, który wywoła konstruktor nadklasy, pośrednio lub za pomocą słowa kluczowego Super .
Zalety dziedziczenia w Javie:
- Ponowne wykorzystanie kodu: Dziedziczenie pozwala na ponowne wykorzystanie kodu i zmniejsza ilość kodu, który należy napisać. Podklasa może ponownie wykorzystać właściwości i metody nadklasy, redukując powielanie kodu.
- Abstrakcja: Dziedziczenie pozwala na tworzenie klas abstrakcyjnych, które definiują wspólny interfejs dla grupy powiązanych klas. Promuje to abstrakcję i enkapsulację, dzięki czemu kod jest łatwiejszy w utrzymaniu i rozszerzaniu.
- Hierarchia klas: Dziedziczenie pozwala na utworzenie hierarchii klas, która może być używana do modelowania obiektów świata rzeczywistego i ich relacji.
- Polimorfizm: Dziedziczenie pozwala na polimorfizm, czyli zdolność obiektu do przyjmowania wielu form. Podklasy mogą przesłaniać metody nadklasy, co pozwala im zmieniać swoje zachowanie na różne sposoby.
Wady dziedziczenia w Javie:
- Złożoność: Dziedziczenie może sprawić, że kod będzie bardziej złożony i trudniejszy do zrozumienia. Jest to szczególnie prawdziwe, jeśli hierarchia dziedziczenia jest głęboka lub jeśli używane jest dziedziczenie wielokrotne.
- Ścisłe powiązanie: Dziedziczenie tworzy ścisłe powiązanie pomiędzy nadklasą i podklasą, co utrudnia wprowadzanie zmian w nadklasie bez wpływu na podklasę.
Wniosek
Sprawdźmy kilka ważnych punktów z artykułu wymienionych poniżej:
- Domyślna nadklasa : Z wyjątkiem Obiekt klasa, która nie ma nadklasy, każda klasa ma jedną i tylko jedną bezpośrednią nadklasę (pojedyncze dziedziczenie). W przypadku braku innej jawnej nadklasy, każda klasa jest domyślnie podklasą klasy Object.
- Superklasa może być tylko jedna: Nadklasa może mieć dowolną liczbę podklas. Ale podklasa może mieć tylko jeden superklasa. Dzieje się tak dlatego, że Java nie obsługuje wielokrotnego dziedziczenia z klasami. Chociaż w przypadku interfejsów Java obsługuje wielokrotne dziedziczenie.
- Dziedziczenie konstruktorów: Podklasa dziedziczy wszystkie elementy (pola, metody i klasy zagnieżdżone) ze swojej nadklasy. Konstruktory nie są członkami, więc nie są dziedziczone przez podklasy, ale konstruktor nadklasy można wywołać z podklasy.
- Dziedziczenie członka prywatnego: Podklasa nie dziedziczy prywatnych elementów swojej klasy nadrzędnej. Jeśli jednak nadklasa posiada metody publiczne lub chronione (takie jak metody pobierające i ustawiające) umożliwiające dostęp do jej pól prywatnych, mogą one być również używane przez podklasę.
Często zadawane pytania dotyczące dziedziczenia
1. Czym jest dziedziczenie Java?
Dziedziczenie to koncepcja OOP, w której jedna klasa dziedziczy z innej klasy, która może ponownie wykorzystywać metody i pola klasy nadrzędnej.
2. Jakie są 4 typy dziedziczenia w Javie?
Istnieją pojedyncze, wielokrotne, wielopoziomowe, hierarchiczne i hybrydowe
3. Jakie jest zastosowanie słowa kluczowego Extend?
Słowo kluczowe Extend służy do dziedziczenia jednej klasy po drugiej.
4. Jaki jest przykład dziedziczenia w Javie?
Poniżej przedstawiono rzeczywisty przykład dziedziczenia w Javie:
Rozważmy grupę pojazdów. Musisz utworzyć klasy dla autobusów, samochodów osobowych i ciężarówek. Metody FuelAmount(), pojemność(), ApplyBrakes() będą takie same dla wszystkich trzech klas.
Wykorzystane odniesienia:
- Head First Java autorstwa Kathy Sierra i Berta Batesa
- Java: Przewodnik dla początkujących autorstwa Herberta Schildta
- Java: The Complete Reference autorstwa Herberta Schildta
- Efektywna Java autorstwa Joshuy Blocha
- Java: Dobre części autorstwa Jima Waldo.