Спадковість (inheritance). Основні поняття. Базовий клас та похідний клас. Ключове слово extends. Приховування даних в успадкованих класах. Модифікатори доступу private, protected, public

Спадковість (inheritance). Основні поняття. Базовий клас та похідний клас. Ключове слово extends. Приховування даних в успадкованих класах. Модифікатори доступу private, protected, public


Зміст



1. В чому полягає суть спадковості в класах? Що таке спадковість?

З точки зору ООП спадковість – це отримання класом програмного коду іншого класу (класів) з метою його використання, модифікації, розширення. Спадковість – це одна з переваг об’єктно-орієнтованого програмування порівняно з процедурно-орієнтованим.

При спадковості новий (успадкований, похідний) клас є спеціалізацією вже існуючого класу.

У випадку спадковості в цілому розділяють два класи:

  • базовий клас (base class) – це клас, який служить основою для іншого (інших класів);
  • похідний клас (derived class) – це клас, який успадковує код базового класу. Похідний клас має можливість доповнювати базовий клас додатковими полями та методами. Також похідний клас має можливість “перевантажувати” або перевизначати методи базового класу.

Організацією спадковості займається компілятор.

2. Який клас в технології Java є базовим для усіх новостворених класів?

Якщо створюється новий клас, який немає базового класу, то цей клас завжди є похідним від стандартного класу Object. Клас Object є базовим для усіх новостворених класів Java.

3. Який синтаксис успадкування класів? Загальна форма успадкування. Ключове слово extends

При успадкуванні класів використовується ключове слово extends. Якщо клас B успадковує дані та методи класу A, то синтаксис успадкування виглядає наступним чином:

class A
{
    // ...
}

class B extends A
{
    // ...
}

4. Які модифікатори доступу можна використовувати до членів даних та методів класу при успадкуванні?

До членів даних та методів класу можна застосовувати такі модифікатори доступу:

  • private (прихований доступ). У цьому випадку член даних класу або метод класу є доступний тільки з методів даного класу. З методів породжених класів та об’єктів (екземплярів) даного класу доступу не має;
  • protected (захищений доступ). У цьому випадку є доступ з даного класу, об’єкту цього класу та успадкованого класу. Проте немає доступу з об’єкту успадкованого класу;
  • public (загальнодоступний). У цьому випадку є доступ з даного класу, успадкованого класу, об’єкту даного класу а також об’єкту успадкованого класу.

Також член даних класу або метод класу може бути оголошений в класі без використання будь-якого модифікатора (див. п. 9).

5. Які особливості використання модифікатора доступу private у випадку успадкованих класів?

Якщо члени даних або методи класу оголошені з модифікатором доступу private, тоді вони вважаються:

  • доступними з методів класу, в якому вони оголошені;
  • недоступними для усіх інших методів будь-яких класів (успадкованих), екземплярів (об’єктів) будь-яких класів.

6. Які особливості використання модифікатора доступу protected у випадку успадкованих класів?

Якщо члени даних або методи класу оголошені з модифікатором доступу protected, тоді вони вважаються:

  • доступними з методів класу, в якому вони оголошені;
  • доступними з методів успадкованого класу. Це стосується і випадку, коли успадкований клас оголошується в іншому пакеті;
  • доступними з екземплярів (об’єктів) даного класу;
  • недоступними з екземплярів (об’єктів) класу, що був успадкований від даного.

7. Які особливості використання модифікатора доступу public для успадкованих класів?

Модифікатор доступу public застосовується якщо потрібно отримати доступ до члена даних або методу класу з будь-якої точки програми. Доступ до public членів даних та методів класу мають:

  • методи даного класу;
  • методи успадкованого класу;
  • об’єкти даного класу;
  • об’єкти успадкованого класу;
  • об’єкти, що оголошені в методах класів, які знаходяться в інших пакетах.

8. Приклад, що демонструє доступ до даних базового класу з успадкованого класу

У прикладі демонструється доступ до членів даних класу A з похідного класу B. Клас B успадковує члени даних класу A.

Клас A містить три цілочисельних члени даних, які оголошені з різними модифікаторами доступу:

  • a – оголошений як private. Доступ до такого члена даних можливий тільки з методів класу A;
  • b – оголошений як protected. Доступ до такого члена даних можливий тільки з методів класу A та породжених класів. У нашому випадку похідним є клас B. Тому з методів класу B можна використовувати член даних b класу A;
  • c – оголошений як public. Доступ до такого члена даних можливий з методів класу A, методів породжених класів, об’єктів класу A та об’єктів породжених класів.

Нижче наведено код, що демонструє застосування модифікаторів доступу private, protected, public

// клас A - є базовим для класу B
class A
{
    private int a;
    protected int b;
    public int c;
}

// клас B успадковує клас A
public class B extends A
{
    void AccessDemo()
    {            
        // a = 5; // помилка, a - прихований (private) член даних класу
        b = 10; // дозволено, b оголошено як захищений член даних (protected)
        c = 15; // дозволено, c - загальнодоступний член даних
    }

    public static void main(String[] args)
    {
        // демонстрація доступу до полів класу A
        B objB = new B(); // об'єкт класу B
        A objA = new A(); // об'єкт класу A
          
        // 1. Доступ до полів з об'єкту класу A
        // objA.a = 15; // заборонено, помилка, член даних a оголошено як приватний (private)
        objA.b = 17; // дозволено, b оголошено як захищений (protected)        
        objA.c = 13; // дозволено, c оголошено як public

        // 2. Доступ до полів та методів з об'єкту класу B
        objB.AccessDemo(); // виклик методу класу B                  

        // objB.a = 30; - помилка, a - приватний (private) член даних класу       
        // objB.b = 30; - також помилка, b - захищений (protected) член даних класу       
        objB.c = 25; // дозволено, тому що c в класі A оголошено як public

        int d = objB.c; // d = 25
        int d2 = objA.b; // d2 = 17            
    }
}

9. Який тип доступу має член даних або метод класу, що не містить жодного модифікатора доступу в своєму оголошенні? Приклад

Перед оголошенням члена даних класу не обов’язково ставити модифікатор доступу. Можливий випадок, коли модифікатор доступу не ставиться. У цьому випадку член даних класу або метод класу є:

  • доступний з методів даного класу;
  • доступний з усіх методів класів, що реалізовані у даному пакеті (пакетний доступ). Це стосується і успадкованих класів, що реалізовані в даному пакеті. У цьому випадку тип доступу вважається як public, але в межах пакету. За межами пакету такий елемент класу є недоступним;
  • недоступний для будь-яких методів інших класів, що розміщуються в інших пакетах. Це стосується і успадкованих класів.

Приклад. Продемонстровано оголошення внутрішнього члена даних класу C без модифікатора доступу.

public class C
{
    double x; // оголошення члена даних x без модифікатора доступу

    // ...
}

У даному випадку член даних x класу C є видимий в межах пакету. Більш детально про пакети в Java описується тут.

10. Чи може клас успадковувати інший клас, який розміщується в іншому пакеті?

Так. У цьому випадку правила успадкування такі самі, як і у випадку з класами з одного пакету.


Зв’язані теми