В 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 Door
open()
Создайте класс входной двери дома, который наследуется от класса Door, и откройте его. Предположим, у двери дома запертая дверная ручка, и она поворачивается внутрь дома. Подсказка: ваш код должен использовать super
ключевое слово.