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

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


Содержание



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

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

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

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

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

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

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

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


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