types inheritance java single vs multiple inheritance
Научете всичко за различните видове наследяване в Java с помощта на прости примери. Разберете дали Java поддържа множествено наследяване:
Представихме наследството в Java заедно с различните основни концепции, свързани с наследяването, на читателите в последния ни урок.
В този урок ще разгледаме допълнително темата за наследяването и ще научим повече за видовете наследяване.
=> Проверете ВСИЧКИ уроци по Java тук.
най-добрата програма за наблюдение на процесора на процесора
Какво ще научите:
Видове наследяване в Java
В зависимост от начина на наследяване на класовете и колко класове се наследяват, имаме следните типове наследяване, както е показано на фигурата по-долу.
Както е показано на горната фигура, има пет типа наследства в обектно-ориентираното програмиране, както е описано по-долу:
# 1) Единично наследяване: Когато производен клас или подклас наследява само от една основа или суперклас, това е единично наследяване.
# 2) Наследяване на много нива: В многостепенното наследяване имаме повече от едно ниво, при което клас се наследява от основен клас, а производният клас от своя страна се наследява от друг клас.
# 3) Йерархично наследяване: Йерархия на наследяване се формира при този тип наследяване, когато суперклас се наследява от повече от един клас.
# 4) Множествено наследяване: Множественото наследяване е това, при което клас може да наследи свойства и поведение от повече от един родител.
# 5) Хибридно наследяване: Когато се комбинират един или повече видове наследство, то се превръща в хибридно наследство.
Имайте предвид, че Java поддържа само единичен, многостепенен и йерархичен тип наследяване с използване на класове. Java не поддържа множествено и хибридно наследяване с класове.
Сега ще обсъдим подробно всеки тип наследяване с примери за програмиране.
Единично наследяване в Java
Едно наследство е изобразено, както е показано по-долу:
Тук подкласът наследява от един суперклас. Това е единично наследство. Всяко животно като Куче наследява от Животния вид. Това е най-простата форма на наследяване.
По-долу е дадена Java програма, която обяснява Single Inheritance.
//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 } }
Изход:
Тук имаме един метод за хранене (Action_eat) в базовия клас Animal, който е общ за животинските видове. Имаме производен клас Куче, който произлиза от клас Животни. В класа Куче имаме метод, специфичен за видовете кучета, кора (Action_bark).
След това създаваме обект Dog в основния метод и тъй като класът Dog е наследил класа Animal, този обект може да извика метода eat, както и bark.
Многостепенно наследяване в Java
При многостепенното наследяване имаме верига за наследяване. Това означава, че имаме родителски клас, който се наследява от производен клас. Производният клас от своя страна действа като родител на друг клас и така нататък.
Наследяването на няколко нива може да бъде представено по-долу:
Както се вижда на горната фигура, има родителски клас А. Клас B наследява от клас A. Тогава има друг клас C, който от своя страна наследява от клас B. По този начин можем да видим, че той формира верига от наследяване. Тук клас B се превръща в посреднически клас, който свързва класове A и C.
Продължавайки с нашия пример за клас Animal по-долу, можем да имаме клас Dog, получен от клас Animal. Тогава можем да имаме друг клас кученце, което е бебе куче, получено от клас куче. По този начин можем да получим многостепенното наследство.
Примерна програма за многостепенно наследяване е показана по-долу.
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 } }
Изход:
Програмирахме точната верига, показана по-горе. След това в основния метод създаваме обект от клас C. Обектът от клас C може след това да има достъп до методите на своя родител B, както и баба и дядо A.
Йерархично наследяване в Java
Един клас може да има повече от един клас, получен от него. Така че имаме една основа или суперклас и повече от един подклас. Този тип наследство се нарича „Йерархично наследство“.
Йерархичното наследяване е схематично представено по-долу:
Като пример за йерархично наследяване можем да представим клас Animal като суперклас и след това да имаме повече от едно животно като котка, куче, крава и т.н., получени от него.
Програмата за Java по-долу демонстрира йерархичното наследяване в 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 } }
Изход:
Както виждаме от програмата, имаме родителски клас и три дъщерни класа, получени от този родител. В основния метод създаваме обект от всеки от дъщерните класове и извикваме съответните им членове.
За извикване на методите на родителския клас имайте предвид, че можем да използваме всеки от обектите на дъщерния клас, тъй като всички имат достъп до родителския клас.
Множествено наследяване в Java
Множественото наследяване е ситуация, при която един клас може да наследи от повече от един клас, т.е. един клас може да има повече от един родител. Правейки това, класът може да има повече от един суперклас и по този начин да придобие свойствата и поведението на всички свои суперкласове.
Диаграмното представяне на множественото наследяване е показано по-долу:
Както е показано по-горе, можем да извлечем клас от повече от един клас едновременно. По този начин производният клас ще придобие характеристиките на всички свои родителски класове. Това може да породи сериозни неясноти, особено когато наследените функции са еднакви.
Забележка:Java не поддържа множествено наследяване с използване на класове. Но той поддържа множествено наследяване, използвайки интерфейси, които ще обсъдим в следващия урок за наследяване.
Тъй като Java не поддържа множествено наследяване с класове, няма да навлизаме в подробностите. По-късно в урока обаче ще се опитаме да разберем причините за Java, която не поддържа множествено наследяване.
Хибридно наследяване в Java
Хибридното наследяване е комбинация от един или повече видове наследства, които обсъдихме по-горе. Всяка комбинация обаче води до тип множествено наследяване, което не се поддържа от Java.
Хибридно наследство може да бъде представено схематично, както по-долу.
Следователно Java не поддържа хибридно наследяване, както и с класове. Но подобно на множественото наследяване, ние можем да внедрим хибридно наследяване в Java, използвайки интерфейси. Ще обсъдим това подробно в следващия урок.
Защо Java не поддържа множествено наследяване?
Java се стреми към простота в програмите. Това важи дори за функциите на OOP. Така че, когато става въпрос за множествено наследяване, могат да възникнат някои двусмислени ситуации, когато извлечем клас от повече от един клас.
Сега нека разберем проблемите, които могат да възникнат, когато имаме множествено наследяване в нашата програма.
Обмислете следните системи за множествено наследяване.
Ако видим горната система, тя се обяснява сама по себе си. Тук клас A и клас B са класове с два родителя, наследени от клас C. Сега показахме, че и класовете A и B имат метод с едно и също име, т.е. print (). Така че, когато клас C наследи A и B, тогава той ще получи и двете версии на метода print ().
В този случай клас C няма да знае кой метод трябва да наследи. Това е двусмислената ситуация, която споменахме по-горе и възниква в случай на множествено наследяване.
Следователно Java издава грешка в компилатора, когато класът наследява от повече от един клас.
внедряване на графика в c ++
Следващата 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(); } }
Изход:
Както се вижда от изхода, Java компилаторът издава грешка, когато установи, че класът разширява два класа.
Въпреки че Java не позволява два класа да бъдат наследени едновременно, тя ни предлага начин за заобикаляне на това ограничение. Можем да симулираме множествено наследяване, като използваме интерфейси вместо класове. Ще обсъдим това в следващите ни уроци.
Диамантен проблем
Множественото наследяване води до ситуация, наречена „Диамантен проблем“.
Помислете, че имаме следната система за наследяване.
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 }
Можем да представим схемата схематично, както е показано по-долу:
Както виждаме от горната диаграма, цялата система за наследяване се появява във формата на диамант. Поради тази диамантена структура неяснотата е наречена „Диамантен проблем”.
Както беше обяснено по-рано за множественото наследяване, неяснотата тук е множественият брой копия на метода show (), който класът Sample получава в резултат на наследяване. Тъй като има множество пътища, той постига метода show () и има неяснота относно това кое копие да се наследи.
Както при множественото наследяване, проблемът с диамантите също може да бъде разрешен с помощта на интерфейси.
Правила за наследяване в Java
Досега видяхме основите на наследяването, както и видовете наследяване в Java, нека изброим някои правила, които трябва да следваме, докато разработваме приложения с наследяване.
Правило # 1: Java не поддържа множествено наследяване
Както вече видяхме, Java не поддържа множествено наследяване под каквато и да е форма. Когато се опитва многократно наследяване в програма, Java компилаторът издава грешка на компилатора.
Правило №2: Java не позволява циклично наследяване
Клас, който се наследява, за да образува цикъл, се нарича Циклично наследяване.
Помислете за следните класове, class1 и class2.
class class1 разширява клас 2 {}
class class2 разширява клас 1 {}
Горната ситуация образува цикъл. Това не е разрешено в Java.
Правило # 3: Не можем да наследяваме членове с частни данни
Вече научихме в темата „Модификатори на достъп“, че членовете с частен достъп не могат да бъдат наследявани.
Правило # 4: Конструкторите не се наследяват
Тъй като конструкторите се използват за създаване на обекти на класове, те не се наследяват от един клас в друг.
Правило # 5: Можем да използваме родителска препратка за достъп до дъщерни обекти
Вече видяхме различни примери за наследяване. Можем да създадем препратка към тип родителски клас и след това да му присвоим обект на производен клас, създаден с помощта на новата ключова дума.
Ако super е суперклас и sub е клас, получен от super, както е показано по-долу.
class super{} class sub extends super{ public static void main(String() args){ super s_obj = new sub(); } }
Правило # 6: Конструкторите родители се изпълняват поради super () в производни конструктори
Едно от правилата гласи, че конструкторите не могат да бъдат наследявани. Но конструкторът на суперкласа може да бъде изпълнен вътре в конструктора на производния клас с помощта на извикване super ().
често задавани въпроси
В # 1) Кой тип наследяване не се поддържа от Java?
Отговор: Java не поддържа множествено наследяване, тъй като може да доведе до проблеми в приложения като диамантения проблем. Java също не поддържа хибридно наследяване, тъй като е комбинация от един или повече типове наследяване и в крайна сметка може да се превърне в множествено наследяване.
В # 2) Кой от членовете на класа може да бъде наследен?
Отговор: Класът може да наследи публични и защитени членове на своя основен клас, но няма достъп до частните членове на базовия клас.
В # 3) Защо не е разрешено множествено наследяване?
Отговор: Множественото наследяване води до неяснота, когато класовете с два родителя имат методи с един и същ прототип. В този случай производният клас е изправен пред неяснота относно това от кой базов клас трябва да наследи метода.
Множественото наследяване може също да доведе до проблем с диаманти в Java. Следователно Java не поддържа множествено наследяване.
В # 4) Защо се нуждаете от множествено наследяване?
Отговор: Езици като Java и C # налагат множественото наследяване с помощта на множество интерфейси. Така че, когато трябва да наследим функции от повече от един интерфейс, тогава се нуждаем от множествено наследяване.
В # 5) Каква е основната употреба на многостепенното наследяване?
Отговор: За клас, получен от друг клас, който от своя страна е получен от трети клас, се казва, че показва многостепенно наследство. Нивата в този тип наследяване могат да бъдат разширени до произволно число, стига да поддържа яснота и простота.
Можем да изобразим различни нива на видовете, използвайки многостепенно наследство. От гледна точка на програмирането, когато искаме да представим различни нива на класове на приложения, тогава се насочваме към многостепенно наследяване.
Заключение
В този урок обсъдихме видовете наследяване в Java. Java поддържа само единични, многостепенни и йерархични типове наследяване. Java не поддържа множествено и хибридно наследяване. Обсъдихме неяснотата на множественото наследяване и проблема с диамантите в Java.
След това обсъдихме различните правила, които трябва да следваме, докато прилагаме наследяването в Java. С това завършихме дискусията си за връзката IS-A в Java.
=> Внимавайте тук за простия сериал за обучение на Java.
Препоръчително четене
- Какво е наследяване в Java - Урок с примери
- Наследяване в C ++
- Видове наследяване в C ++
- Основи на Java: Синтаксис на Java, клас Java и основни концепции на Java
- Java Integer и Java BigInteger клас с примери
- Видове класове в Java: абстрактни, конкретни, окончателни, статични
- Java променливи и техните типове с примери
- Урок за клас Java Scanner с примери