types inheritance java single vs multiple inheritance
Dowiedz się wszystkiego o różnych typach dziedziczenia w Javie, korzystając z prostych przykładów. Dowiedz się, czy Java obsługuje wielokrotne dziedziczenie:
W naszym ostatnim tutorialu przedstawiliśmy dziedziczenie w Javie wraz z różnymi podstawowymi koncepcjami związanymi z dziedziczeniem dla czytelników.
W tym samouczku przyjrzymy się dokładniej tematowi dziedziczenia i dowiemy się więcej o typach dziedziczenia.
=> Sprawdź WSZYSTKIE samouczki Java tutaj.
pytania do wywiadu dotyczącego testów penetracyjnych aplikacji internetowych
Czego się nauczysz:
- Rodzaje dziedziczenia w Javie
- Pojedyncze dziedziczenie w Javie
- Dziedziczenie wielopoziomowe w Javie
- Dziedziczenie hierarchiczne w Javie
- Dziedziczenie wielokrotne w Javie
- Dziedziczenie hybrydowe w Javie
- Dlaczego Java nie obsługuje dziedziczenia wielokrotnego?
- Diamentowy problem
- Reguły dziedziczenia w Javie
- Często Zadawane Pytania
- Wniosek
Rodzaje dziedziczenia w Javie
W zależności od sposobu dziedziczenia klas i liczby klas dziedziczonych mamy następujące typy dziedziczenia, jak pokazano na poniższym rysunku.
Jak pokazano na powyższym rysunku, istnieje pięć typów dziedziczenia w programowaniu zorientowanym obiektowo, jak opisano poniżej:
1) Dziedziczenie pojedyncze: Gdy klasa lub podklasa pochodna dziedziczy tylko z jednej podstawowej lub nadklasy, jest to dziedziczenie pojedyncze.
# 2) Dziedziczenie wielopoziomowe: W przypadku dziedziczenia wielopoziomowego mamy więcej niż jeden poziom, w którym klasa dziedziczy z klasy bazowej, a klasa pochodna z kolei jest dziedziczona przez inną klasę.
# 3) Dziedziczenie hierarchiczne: Hierarchia dziedziczenia jest tworzona w tego typu dziedziczeniu, gdy nadklasa jest dziedziczona przez więcej niż jedną klasę.
# 4) Dziedziczenie wielokrotne: Dziedziczenie wielokrotne to takie, w którym klasa może dziedziczyć właściwości i zachowanie od więcej niż jednego rodzica.
# 5) Dziedziczenie hybrydowe: Kiedy łączy się jeden lub więcej rodzajów dziedziczenia, staje się dziedziczeniem hybrydowym.
Należy pamiętać, że Java obsługuje tylko jedno, wielopoziomowe i hierarchiczne dziedziczenie przy użyciu klas. Java nie obsługuje dziedziczenia wielokrotnego i hybrydowego z klasami.
Teraz omówimy szczegółowo każdy typ dziedziczenia z przykładami programowania.
Pojedyncze dziedziczenie w Javie
Przedstawiono pojedyncze dziedziczenie, jak pokazano poniżej:
Tutaj podklasa dziedziczy z pojedynczej nadklasy. To jest dziedziczenie pojedyncze. Każde zwierzę, takie jak pies, dziedziczy po gatunku zwierząt. To najprostsza forma dziedziczenia.
Poniżej podano program w języku Java, który wyjaśnia pojedyncze dziedziczenie.
//base class:Animal class Animal { void Action_eat() { System.out.print('eating...'); } } //derived class:Dog class Dog extends Animal { void Action_bark() { System.out.print('barking...'); } } class Main{ public static void main(String args()){ Dog d=new Dog(); //create an object of derived class System.out.print('The dog is '); d.Action_bark(); //call derived class method System.out.print('
The dog is '); d.Action_eat(); //call base class method } }
Wynik:
Tutaj mamy jedną metodę eat (Action_eat) w klasie bazowej Animal, która jest wspólna dla gatunku Animal. Mamy pochodną klasę Dog, która wywodzi się z klasy Animal. W klasie Dog mamy metodę charakterystyczną dla gatunku Dog, kora (Action_bark).
Następnie tworzymy obiekt Dog w metodzie main i ponieważ klasa Dog odziedziczyła klasę Animal, obiekt ten może wywoływać zarówno metodę eat jak i bark.
Dziedziczenie wielopoziomowe w Javie
W przypadku dziedziczenia wielopoziomowego mamy łańcuch dziedziczenia. Oznacza to, że mamy klasę nadrzędną, która jest dziedziczona przez klasę pochodną. Klasa pochodna z kolei działa jako rodzic dla innej klasy i tak dalej.
Dziedziczenie wielopoziomowe można przedstawić w następujący sposób:
Jak widać na powyższym rysunku, istnieje klasa nadrzędna A. Klasa B dziedziczy po klasie A. Jest też inna klasa C, która z kolei dziedziczy po klasie B. W ten sposób widzimy, że tworzy ona łańcuch dziedziczenia. Tutaj klasa B staje się klasą pośrednią, która łączy klasy A i C.
Kontynuując nasz przykład klasy Animal poniżej, możemy mieć klasę Dog pochodzącą z klasy Animal. Wtedy możemy mieć kolejną klasę Puppy, czyli pieska wywodzącego się z klasy Dog. W ten sposób możemy mieć wielopoziomowe dziedziczenie.
Przykładowy program do dziedziczenia wielopoziomowego przedstawiono poniżej.
import java.util.*; import java.lang.*; import java.io.*; //parent class A class A { public void print_A() { System.out.print('SoftwareTestingHelp '); } } //Derived class B - intermediary class B extends A { public void print_B() { System.out.print('Java Series '); } } //Derived Class C class C extends B { public void print_C() { System.out.print('Tutorials'); } } public class Main { public static void main(String() args) { C c_obj = new C(); //create Class C obj c_obj.print_A(); //call grandparent class method c_obj.print_B(); //call parent class method c_obj.print_C(); //call member method } }
Wynik:
Zaprogramowaliśmy dokładny łańcuch pokazany powyżej. Następnie w metodzie głównej tworzymy obiekt klasy C. Obiekt klasy C może wtedy uzyskać dostęp do metod swojego rodzica B, jak również dziadka A.
Dziedziczenie hierarchiczne w Javie
Klasa może mieć więcej niż jedną klasę pochodną. Mamy więc jedną podstawową lub nadklasę i więcej niż jedną podklasę. Ten typ dziedziczenia nazywa się „dziedziczeniem hierarchicznym”.
Hierarchiczne dziedziczenie jest przedstawione schematycznie poniżej:
Jako przykład dziedziczenia hierarchicznego możemy przedstawić klasę Animal jako nadklasę, a następnie wyprowadzić z niej więcej niż jedno zwierzę, takie jak Kot, Pies, Krowa itp.
Poniższy program w języku Java przedstawia dziedziczenie hierarchiczne w języku Java.
//class Parent class Parent { public void print_parent() { System.out.println('In ::Parent class'); } } //child1 class class Child1 extends Parent { public void print_child1() { System.out.println('In ::Child1 class'); } } //child2 class class Child2 extends Parent { public void print_child2() { System.out.println('In ::Child2 class'); } } //child3 class class Child3 extends Parent { public void print_child3() { System.out.println('In ::Child3 class'); } } public class Main { public static void main(String() args) { Child1 ch1 = new Child1(); //create a Child1 class object ch1.print_child1(); //call its member method Child2 ch2 = new Child2(); //create a Child2 class object ch2.print_child2(); //call its member method Child3 ch3 = new Child3(); //create a Child3 class object ch3.print_child3(); //call its member method ch3.print_parent(); //call parent class method with any object } }
Wynik:
Jak widzimy w programie, mamy klasę nadrzędną i trzy klasy potomne pochodzące od tego rodzica. W metodzie głównej tworzymy obiekt każdej z klas potomnych i wywołujemy odpowiadające im metody składowe.
W celu wywołania metod klasy nadrzędnej należy pamiętać, że możemy użyć dowolnego obiektu klasy potomnej, ponieważ wszystkie mają dostęp do klasy nadrzędnej.
Dziedziczenie wielokrotne w Javie
Dziedziczenie wielokrotne to sytuacja, w której jedna klasa może dziedziczyć z więcej niż jednej klasy, tj. Jedna klasa może mieć więcej niż jednego rodzica. W ten sposób klasa może mieć więcej niż jedną nadklasę, a tym samym uzyskać właściwości i zachowanie wszystkich swoich nadklas.
Schematyczna reprezentacja wielokrotnego dziedziczenia jest pokazana poniżej:
Jak pokazano powyżej, możemy wyprowadzić klasę z więcej niż jednej klasy jednocześnie. W ten sposób klasa pochodna uzyska cechy wszystkich swoich klas nadrzędnych. Może to powodować poważne niejasności, zwłaszcza gdy odziedziczone cechy są takie same.
Uwaga:Java nie obsługuje wielokrotnego dziedziczenia przy użyciu klas. Ale obsługuje dziedziczenie wielokrotne przy użyciu interfejsów, które omówimy w następnym samouczku dotyczącym dziedziczenia.
Ponieważ Java nie obsługuje wielokrotnego dziedziczenia z klasami, nie będziemy wchodzić w szczegóły. Jednak w dalszej części samouczka postaramy się zrozumieć powody, dla których Java nie obsługuje dziedziczenia wielokrotnego.
Dziedziczenie hybrydowe w Javie
Dziedziczenie hybrydowe to połączenie jednego lub więcej typów dziedziczenia, które omówiliśmy powyżej. Każda kombinacja powoduje jednak dziedziczenie wielokrotne, które nie jest obsługiwane przez język Java.
Dziedziczenie hybrydowe można schematycznie przedstawić, jak poniżej.
W związku z tym Java nie obsługuje dziedziczenia hybrydowego również z klasami. Ale podobnie jak w przypadku dziedziczenia wielokrotnego, możemy wdrożyć dziedziczenie hybrydowe w Javie za pomocą interfejsów. Omówimy to szczegółowo w naszym następnym samouczku.
Dlaczego Java nie obsługuje dziedziczenia wielokrotnego?
Java stawia na prostotę w programach. Dotyczy to nawet funkcji OOP. Więc jeśli chodzi o dziedziczenie wielokrotne, mogą pojawić się niejednoznaczne sytuacje, gdy wyprowadzimy klasę z więcej niż jednej klasy.
Przyjrzyjmy się teraz problemom, które mogą się pojawić, gdy w programie mamy dziedziczenie wielokrotne.
Rozważ następujące systemy wielokrotnego dziedziczenia.
Jeśli widzimy powyższy system, jest on oczywisty. Tutaj klasa A i klasa B są dwoma klasami nadrzędnymi dziedziczonymi przez klasę C. Teraz pokazaliśmy, że obie klasy A i B mają metodę o tej samej nazwie, tj. Print (). Więc kiedy klasa C dziedziczy A i B, to otrzyma obie wersje metody print ().
W tym przypadku klasa C nie będzie wiedziała, którą metodę powinna dziedziczyć. Jest to niejednoznaczna sytuacja, o której wspomnieliśmy powyżej, która pojawia się w przypadku wielokrotnego dziedziczenia.
W związku z tym Java generuje błąd kompilatora, gdy klasa dziedziczy z więcej niż jednej klasy.
Pokazuje to poniższy program w języku Java.
class A{ void print(){ System.out.println('Class A :: print()'); } } class B{ void print(){ System.out.println('Class B :: print()'); } } class C extends A , B{ //let C inherit from A and B } public class Main { public static void main(String() args) { C cObj = new C(); c.print(); } }
Wynik:
jaka aplikacja umożliwia pobieranie filmów z YouTube
Jak widać z danych wyjściowych, kompilator Java wyświetla błąd, gdy stwierdzi, że klasa rozszerza dwie klasy.
Chociaż Java nie pozwala na jednoczesne dziedziczenie dwóch klas, oferuje sposób obejścia tego ograniczenia. Możemy symulować wielokrotne dziedziczenie za pomocą interfejsów zamiast klas. Omówimy to w naszych kolejnych tutorialach.
Diamentowy problem
Wielokrotne dziedziczenie skutkuje sytuacją zwaną „problemem diamentów”.
Weź pod uwagę, że mamy następujący system dziedziczenia.
class Super{ void show(){} } class Sub1 extends super{ void show1(){} } class Sub2 extends super{ void show2(){} } class sample extends Sub1,Sub2{ //Sample class code here }
Możemy schematycznie przedstawić ten system, jak pokazano poniżej:
Jak widać na powyższym diagramie, cały system dziedziczenia ma kształt rombu. Ze względu na tę strukturę diamentu tę niejednoznaczność określa się mianem „problemu diamentu”.
Jak wyjaśniono wcześniej w przypadku dziedziczenia wielokrotnego, niejednoznacznością jest tutaj wielokrotna liczba kopii metody show (), które klasa Sample uzyskuje w wyniku dziedziczenia. Ponieważ istnieje wiele ścieżek, osiąga metodę show () i istnieje niejasność dotycząca tego, która kopia ma dziedziczyć.
Podobnie jak w przypadku dziedziczenia wielokrotnego, problem diamentów można również rozwiązać za pomocą interfejsów.
Reguły dziedziczenia w Javie
Do tej pory poznaliśmy podstawy dziedziczenia, a także typy dziedziczenia w Javie. Wymieńmy kilka reguł, których musimy przestrzegać podczas tworzenia aplikacji z dziedziczeniem.
Zasada nr 1: Java nie obsługuje dziedziczenia wielokrotnego
Jak już widzieliśmy, Java nie obsługuje dziedziczenia wielokrotnego w żadnej formie. W przypadku próby wielokrotnego dziedziczenia w programie kompilator języka Java zgłasza błąd kompilatora.
Zasada nr 2: Java nie zezwala na dziedziczenie cykliczne
Klasa dziedzicząca się w celu utworzenia cyklu nazywana jest dziedziczeniem cyklicznym.
Rozważ następujące klasy, class1 i class2.
klasa class1 rozszerza klasę 2 {}
class class2 rozszerza klasę 1 {}
Powyższa sytuacja tworzy pętlę. Nie jest to dozwolone w Javie.
Zasada nr 3: Nie możemy dziedziczyć prywatnych członków danych
Dowiedzieliśmy się już w temacie „Modyfikatory dostępu”, że członkowie z dostępem prywatnym nie mogą być dziedziczeni.
Zasada 4: Konstruktorzy nie są dziedziczeni
Ponieważ konstruktory są używane do tworzenia obiektów klas, nie są one dziedziczone z jednej klasy do drugiej.
Zasada # 5: Możemy użyć odniesienia rodzica, aby uzyskać dostęp do obiektów potomnych
Widzieliśmy już różne przykłady dziedziczenia. Możemy utworzyć odwołanie do klasy rodzicielskiej typu, a następnie przypisać mu obiekt klasy pochodnej utworzony przy użyciu słowa kluczowego new.
Jeśli super jest klasą nadrzędną, a podklasą jest pochodną klasy super, jak pokazano poniżej.
class super{} class sub extends super{ public static void main(String() args){ super s_obj = new sub(); } }
Zasada # 6: Konstruktory nadrzędne są wykonywane z powodu super () w konstruktorach pochodnych
Jedna z reguł stanowi, że nie można dziedziczyć konstruktorów. Ale konstruktor nadklasy można wykonać wewnątrz konstruktora klasy pochodnej za pomocą wywołania super ().
Często Zadawane Pytania
P # 1) Jaki typ dziedziczenia nie jest obsługiwany przez Javę?
Odpowiedź: Java nie obsługuje dziedziczenia wielokrotnego, ponieważ może to powodować problemy w aplikacjach, takich jak problem z diamentami. Java również nie obsługuje dziedziczenia hybrydowego, ponieważ jest to kombinacja jednego lub więcej typów dziedziczenia i może ostatecznie przekształcić się w dziedziczenie wielokrotne.
P # 2) Którzy członkowie klasy mogą być dziedziczeni?
Odpowiedź: Klasa może dziedziczyć publiczne i chronione elementy członkowskie swojej klasy bazowej, ale nie może uzyskać dostępu do prywatnych elementów członkowskich klasy bazowej.
Pytanie 3) Dlaczego dziedziczenie wielokrotne jest niedozwolone?
Odpowiedź: Wielokrotne dziedziczenie powoduje niejednoznaczność, gdy dwie klasy nadrzędne mają metody z tym samym prototypem. W takim przypadku klasa pochodna napotyka niejednoznaczność dotyczącą tego, z której klasy bazowej powinna dziedziczyć metodę.
Dziedziczenie wielokrotne może również powodować problem z diamentami w Javie. Dlatego Java nie obsługuje dziedziczenia wielokrotnego.
P # 4) Dlaczego potrzebujesz wielokrotnego dziedziczenia?
Odpowiedź: Języki, takie jak Java i C #, wymuszają wielokrotne dziedziczenie przy użyciu wielu interfejsów. Kiedy więc musimy dziedziczyć funkcje z więcej niż jednego interfejsu, potrzebujemy dziedziczenia wielokrotnego.
P # 5) Jakie jest główne zastosowanie dziedziczenia wielopoziomowego?
Odpowiedź: Mówi się, że klasa wywodząca się z innej klasy, która z kolei pochodzi od trzeciej klasy, wykazuje wielopoziomowe dziedziczenie. Poziomy w tego rodzaju dziedziczeniu można rozszerzyć do dowolnej liczby, o ile zachowuje to przejrzystość i prostotę.
Możemy przedstawić różne poziomy gatunków za pomocą wielopoziomowego dziedziczenia. Z programistycznego punktu widzenia, gdy chcemy reprezentować różne poziomy klas aplikacji, wybieramy dziedziczenie wielopoziomowe.
Wniosek
W tym samouczku omówiliśmy typy dziedziczenia w Javie. Java obsługuje tylko dziedziczenie typu Single, Multilevel i Hierarchical. Java nie obsługuje dziedziczenia wielokrotnego i hybrydowego. Omówiliśmy niejednoznaczność dziedziczenia wielokrotnego i problem diamentów w Javie.
Następnie omówiliśmy różne zasady, których powinniśmy przestrzegać podczas implementowania dziedziczenia w Javie. Tym samym zakończyliśmy dyskusję na temat relacji IS-A w Javie.
=> Obejrzyj serię prostych szkoleń dotyczących języka Java.
rekomendowane lektury
- Co to jest dziedziczenie w Javie - samouczek z przykładami
- Dziedziczenie w C ++
- Rodzaje dziedziczenia w C ++
- Podstawy języka Java: składnia języka Java, klasa języka Java i podstawowe pojęcia dotyczące języka Java
- Klasa Java Integer i Java BigInteger z przykładami
- Rodzaje zajęć w Javie: abstrakcyjne, konkretne, końcowe, statyczne
- Zmienne Java i ich typy z przykładami
- Samouczek klasy skanera Java z przykładami