Наследование в Java
Понятие наследования
Наследование — это краеугольный камень технологии объектно-ориентированного программирования Java, поскольку оно позволяет создавать иерархические классы.
Наследование означает, что подкласс наследует характеристики и поведение родительского класса, так что объекты (экземпляры) подкласса обладают полями экземпляра и методами родительского класса, или подкласс наследует методы от родительского класса, что даёт подклассу такое же поведение, как у родительского класса.
Наследование в повседневной жизни:

Кролики и овцы относятся к классу травоядных, а львы и леопарды — к классу плотоядных.
Травоядные и хищники также принадлежат к классу животных.
Следовательно, отношение, которому должно удовлетворять наследование, — это is-a. Родительский класс является более общим, а подкласс — более конкретным.
Хотя травоядные и хищники оба принадлежат к животным, существуют различия в их атрибутах и поведении. Поэтому подкласс будет обладать общими характеристиками родительского класса, а также своими собственными характеристиками.
Формат наследования классов
В Java можно использовать ключевое слово extends, чтобы объявить, что класс наследуется от другого класса. Общая форма выглядит следующим образом:
Формат наследования классов
Зачем нужно наследование?
Далее проиллюстрируем эту необходимость на примере.
Разработайте класс животного, где животными являются пингвин и мышь, со следующими требованиями:
- Пингвин: атрибуты (name, id), методы (eat, sleep, self-introduction)
- Мышь: атрибуты (name, id), методы (eat, sleep, self-introduction)
Класс Penguin:
Mouse:
Из этих двух фрагментов кода видно, что код дублируется, что делает код большим и раздутым, а сопровождаемость низкой (главным образом потому, что при необходимости изменений позже приходится изменять многие части кода, что чревато ошибками). Чтобы кардинально решить проблему этих двух фрагментов кода, необходимо наследование. Выделите общие части этих двух фрагментов кода, чтобы сформировать родительский класс:
Общий родительский класс:
Этот класс Animal может служить родительским классом. После того как классы Penguin и Mouse унаследуют этот класс, они получат атрибуты и методы родительского класса. В подклассах больше не будет дублирующегося кода, сопровождаемость повышается, код становится более кратким, а повторное использование кода улучшается (повторное использование в основном означает, что его можно применять многократно, не записывая один и тот же код снова). Код после наследования:
Класс Penguin:
Mouse:
Типы наследования
Обратите внимание, что Java не поддерживает множественное наследование, но поддерживает многоуровневое наследование.

Характеристики наследования
Подкласс имеет все атрибуты и методы родительского класса, не являющиеся private.
Подкласс может иметь собственные атрибуты и методы, что означает, что подкласс может расширять родительский класс.
Подкласс может реализовать методы родительского класса по-своему.
Наследование в Java является одиночным, но возможно многоуровневое наследование. Одиночное наследование означает, что подкласс может наследовать только от одного родительского класса. Многоуровневое наследование означает, например, что класс B наследует класс A, а класс C наследует класс B. Таким образом, с точки зрения отношений, класс B является родительским для класса C, а класс A — родительским для класса B. Это особенность, отличающая наследование в Java от наследования в C++.
Оно увеличивает связанность между классами (недостаток наследования; высокая связанность делает связи между кодом более тесными, а независимость кода — более слабой).
Ключевые слова наследования
Наследование можно реализовать с помощью двух ключевых слов extends и implements. Кроме того, все классы наследуются от java.lang.Object. Когда класс не использует эти два ключевых слова наследования, он по умолчанию наследует Object (этот класс находится вjava.langпакете, поэтому нет необходимостиimport) класс-предок.
ключевое слово extends
В Java наследование классов является одиночным; то есть подкласс может иметь только один родительский класс, поэтому extends может наследовать только один класс.
ключевое слово extends
ключевое слово implements
Использование ключевого слова implements позволяет косвенно наделить Java характеристиками множественного наследования. Оно применяется, когда класс наследует интерфейсы, и он может наследовать несколько интерфейсов одновременно (интерфейсы разделяются запятыми).
ключевое слово implements
ключевые слова super и this
ключевое слово super:Мы можем использовать ключевое слово super для доступа к членам родительского класса; оно используется для ссылки на родительский класс текущего объекта.
ключевое слово this:Ссылка на самого себя, указывающая на текущий объект, т.е. на экземпляр объекта, которому принадлежит текущий метод или конструктор.
Пример
Результат вывода:
animal : eat dog : eat animal : eat
ключевое слово final
final может использоваться для модификации переменных (включая атрибуты класса, атрибуты объекта, локальные переменные и формальные параметры), методов (включая методы класса и методы объекта) и классов.
final означает "final".
Использование ключевого слова final для объявления класса определяет класс как final-класс, который не может быть унаследован; или оно используется для модификации методов, и такие методы не могут быть переопределены подклассами:
Объявление класса:
final class 类名 {//类体}-
Объявление метода:
修饰符(public/private/default/protected) final 返回值类型 方法名(){//方法体}
Примечание:В классе, определённом с помощью final, его атрибуты и методы не являются final.
Конструктор
Подкласс не наследует конструктор родительского класса (метод конструирования или функцию-конструктор); он лишь вызывает его (неявно или явно). Если конструктор родительского класса имеет параметры, то в конструкторе подкласса вы должны явно использоватьsuper— ключевое слово для вызова конструктора родительского класса с соответствующим списком параметров.
Если конструктор родительского класса не имеет параметров, то в конструкторе подкласса нет необходимости использовать ключевое словоsuperдля вызова конструктора родительского класса; система автоматически вызовет конструктор родительского класса без аргументов.
Пример
Результат вывода:
------SubClass 类继承------ SuperClass() SubClass() SuperClass(int n) SubClass(int n): 100 ------SubClass2 类继承------ SuperClass(int n) SubClass2() SuperClass() SubClass2(int n): 200Другие расширения