types inheritance java single vs multiple inheritance
Дізнайтеся все про різні типи успадкування в Java за допомогою простих прикладів. З’ясуйте, чи підтримує Java багаторазове успадкування:
У нашому останньому навчальному посібнику ми представили читачам спадщину разом із різними основними поняттями, пов’язаними з успадкуванням.
У цьому посібнику ми розглянемо далі тему успадкування та дізнаємось більше про типи успадкування.
=> Перевірте ВСІ підручники Java тут.
запитання для співбесіди з oracle sql для досвідчених
Що ви дізнаєтесь:
Типи успадкування в 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 } }
Вихід:
Тут у нас є один метод eat (Action_eat) у базовому класі Animal, який є загальним для видів тварин. У нас є похідний клас Dog, який походить від класу Animal. У класі Dog ми маємо метод, характерний для видів собак, кора (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 націлена на простоту програм. Це стосується навіть функцій ООП. Отже, коли справа стосується багаторазового успадкування, можуть виникати неоднозначні ситуації, коли ми отримуємо клас з кількох класів.
Тепер давайте розберемося з проблемами, які можуть виникнути, коли ми маємо багаторазове успадкування в нашій програмі.
Розглянемо наступні системи множинного успадкування.
Якщо ми бачимо вищезазначену систему, вона сама собою пояснюється. Тут клас A і клас B є двома батьківськими класами, успадкованими класом C. Тепер ми показали, що обидва класи A і B мають метод з однаковим іменем, тобто print (). Отже, коли клас C успадковує A і B, тоді він отримає обидві версії методу print ().
У цьому випадку клас C не знатиме, який метод він повинен успадкувати. Це неоднозначна ситуація, про яку ми згадали вище, виникає у випадку багаторазового успадкування.
Отже, Java видає помилку компілятора, коли клас успадковує більше ніж один клас.
Наступна програма 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 не дозволяє циклічне успадкування
Клас, який успадковує себе, щоб сформувати цикл, називається циклічним успадкуванням.
Розглянемо наступні класи, клас1 та клас2.
клас class1 розширює клас 2 {}
клас 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 ().
Часті запитання
Q # 1) Який тип успадкування не підтримується Java?
Відповідь: Java не підтримує множинне успадкування, оскільки це може спричинити проблеми в додатках, таких як проблема з алмазами. Java також не підтримує гібридне успадкування, оскільки це комбінація одного або декількох типів успадкування, і в кінцевому підсумку може перетворитися на множинне успадкування.
Q # 2) Кого з членів класу можна успадкувати?
Відповідь: Клас може успадкувати загальнодоступні та захищені члени свого базового класу, але не може отримати доступ до приватних членів базового класу.
Q # 3) Чому не допускається багаторазове успадкування?
Відповідь: Множинне успадкування призводить до неоднозначності, коли дво батьківські класи мають методи з однаковим прототипом. У цьому випадку похідний клас стикається з неоднозначністю щодо того, від якого базового класу він повинен успадкувати метод.
Багаторазове успадкування може також спричинити проблему з діамантами на Java. Отже, Java не підтримує множинне успадкування.
є c ++ краще, ніж java
Q # 4) Навіщо потрібне множинне успадкування?
Відповідь: Такі мови, як Java і C #, забезпечують множинне успадкування за допомогою декількох інтерфейсів. Отже, коли нам потрібно успадкувати функції з більш ніж одного інтерфейсу, тоді нам потрібно багаторазове успадкування.
Q # 5) Яке основне використання багаторівневого успадкування?
Відповідь: Клас, похідний від іншого класу, який, у свою чергу, похідний від третього класу, має багаторівневе успадкування. Рівні в цьому типі успадкування можуть бути розширені до будь-якого числа, якщо воно зберігає чіткість і простоту.
Ми можемо зобразити різні рівні видів за допомогою багаторівневого успадкування. З точки зору програмування, коли ми хочемо представляти різні рівні класів додатків, ми переходимо до багаторівневого успадкування.
Висновок
У цьому підручнику ми обговорили типи успадкування в Java. Java підтримує лише одно-, багаторівневі та ієрархічні типи успадкування. Java не підтримує множинне та гібридне успадкування. Ми обговорили багатозначність успадкування та проблему Diamond у Java.
Потім ми обговорили різні правила, яких слід дотримуватися під час реалізації успадкування в Java. Цим ми завершили обговорення стосунків IS-A на Java.
=> Тут слідкуйте за простими навчальними серіями Java.
Рекомендована література
- Що таке спадкування в Java - Підручник з прикладами
- Спадщина в C ++
- Типи успадкування в C ++
- Основи Java: Синтаксис Java, клас Java та основні концепції Java
- Java Integer та клас Java BigInteger з прикладами
- Типи занять на Java: абстрактні, конкретні, заключні, статичні
- Змінні Java та їх типи на прикладах
- Підручник з класу сканера Java із прикладами