Наследование


В Java термин наследование относится к принятию всех не закрытых свойств и методов одного класса (суперкласса) другим классом (подклассом). Наследование - это способ сделать копию существующего класса отправной точкой для другого. В дополнение к термину «подкласс» унаследованные классы также называются derivedклассами.

На этом этапе может быть полезно отличить наследование от интерфейсов. Интерфейсы определяют только структуру членов класса, в то время как унаследованные классы включают фактический код суперкласса. Кроме того, наследование (точнее, определение подкласса) использует extendsключевое слово в объявлении подкласса.

Для ясности, если подкласс создается с использованием суперкласса, а подкласс остается неизменным, два класса будут идентичными. Но большинство подклассов не остаются неизменными. Поскольку подкласс по-прежнему является классом, его можно изменить, включив в него новые свойства и методы. Готовый подкласс можно даже использовать как суперкласс для создания дополнительных подклассов. Нет эффективного ограничения на количество уровней наследования.

Методы и свойства подкласса можно использовать так же, как и его суперкласса. Их также можно переопределить. Переопределение - это процесс замены (или расширения) исходного кода новым кодом в соответствии с текущей целью. Сигнатура переопределенного метода в подклассе остается такой же, как и в суперклассе, но содержимое метода будет изменено для достижения цели метода в его новой форме. Это может даже означать выполнение кода, унаследованного от суперкласса, до или после выполнения некоторого нового кода в том же методе. Чтобы выполнить унаследованный код из подкласса, добавьте к методу префикс super. Также можно написать конструктор подкласса, который вызывает конструктор суперкласса неявно или с помощью superключевого слова (например, super.methodName ()).

Зачем это делать? Наследование способствует повторному использованию кода и концепции реализации от общего к конкретному. В идеале суперкласс должен быть написан на самом общем уровне. Подклассы затем могут быть созданы из суперкласса с более тонкой, более конкретной целью.

Пример наследования

Представьте себе дверь. Неважно, какой именно. Все двери открываются и закрываются. Тем не менее, некоторые двери открываются иначе, чем другие (поднятие вверх или открытие, открытие или скольжение). Итак, допустим, Door - это суперкласс двери, у которого есть openметод. Метод прост. Это всего лишь инструкция push.

public class Door {
    public void open ()
    {
        push();     // Since this is just a generic "Door" we will assume the simplest opening method.
                    // The actual open method must be overridden by a subclass, as we see below.
                    // Later, a way to force a subclass to override a method will be demonstrated -- 
                    // but for this simple example will do for now.
    }
}

Использование этого класса на двери банковского хранилища может оказаться безуспешным. Лучшей стратегией было бы "создать подкласс" Door с помощью наследования, а затем переопределить openметод для ввода комбинации и pullвместо push.

class BankVaultDoor extends Door {    // The "extends" keyword used to tell java that BankVaultDoor inherits the functionality of Door.

    public void open () {
        enterCombination();
        pull;
    }

}

Преимущество использования наследования заключается в написании кода, который применяется к ряду классов, расширяющих более общий класс. В приведенном ниже примере у нас есть метод, который открывает несколько типов дверей.

public class Main {

    public static void main(String[] args) {
        Door d1 = new BankVaultDoor();
        Door d2 = new HouseFrontDoor();
        Door d3 = new CarDoor();
    }

    if (arg[0] == "car") {
        d3.open();
    } else if (arg[0] == "bank") {
        d1.open();
    } else {
        d2.open();
    }
}

Обратите внимание, что метод не знает (или не заботится) о типе двери. Любой класс, унаследованный от Door (использующий ), будет использовать этот метод, чтобы открыть его.open()extends Dooropen()

Упражнение

Создайте класс входной двери дома, который наследуется от класса Door, и откройте его. Предположим, у двери дома запертая дверная ручка, и она поворачивается внутрь дома. Подсказка: ваш код должен использовать superключевое слово.