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

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


Зміст



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

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

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

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

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

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

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. Чи може клас успадковувати інший клас, який розміщується в іншому пакеті?

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


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