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

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


Содержание



1. В чем состоит суть наследования в классах? Что такое наследование?

С точки зрения объектно-ориентированного программирования наследование – это использование классом программного кода другого класса (классов) с целью  его использования, модификации, расширения. Наследование – это одно из преимуществ объектно-ориентированного программирования в сравнении с процедурно-ориентированным.

При наследовании новый (унаследованный, производный) класс есть специализацией уже существующего класса. В данном случае термины «унаследованный» и «производный» считаются синонимами.

В случае наследования в целом разделяют два класса:

  • базовый класс (base class) или суперкласс – это класс, который служит основой для другого (других классов). В терминологии языка Java используется термин суперкласс;
  • производный класс (derived class) или подкласс – это класс, который наследует код базового класса. В терминологии Java используется термин подкласс. Подкласс имеет возможность дополнять базовый класс дополнительными полями и методами. Также подкласс имеет возможность «перегружать» или переопределять методы суперкласса.

Организацией наследования занимается компилятор.

2. Какой класс в технологии Java есть суперклассом для всех новосозданных классов?

Если создается новый класс, который не имеет суперкласса, то этот класс всегда есть производным от стандартного класса Object. Класс Object есть суперклассом для всех новосозданных классов Java.

3. Какой синтаксис наследования классов? Общая форма наследования

При наследовании классов используется ключевое слово 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. Какой тип доступа имеет член данных или метод класса, который не имеет модификатора доступа в своем объявлении? Пример

Перед объявлением члена данных класса не обязательно ставить модификатор доступа (private, protected, public). Возможен случай, когда модификатор доступа не ставится. В этом случае член данных класса или метод класса есть:

  • доступен из методов данного класса;
  • доступен из всех методов классов, которые реализованы в данном пакете (пакетный доступ). Это касается и подклассов, которые реализованы в данном пакете. В этом случае тип доступа считается как public, но в пределах пакета. За пределами пакета такой элемент класса недоступен;
  • недоступен для любых методов других классов, которые размещаются в других пакетах. Это касается и подклассов.

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

public class C
{
    double x; // объявление члена данных x без модификатора доступа
    // ...
}

В данном случае член данных x класса C есть видимым в пределах пакета. Более подробно о пакетах в Java описывается здесь.

10.  Может ли класс наследовать другой класс, который размещается в другом пакете?

Да. В этом случае правила наследования такие же, как и в случае с классами, реализованными в одном пакете.


Связанные темы