Правила наследования в Java
Данная статья:
- написана командой Vertex Academy. Надеемся, что она Вам будет полезна. Приятного прочтения!
- это одна из статей из нашего "Самоучителя по Java"
Привет! В этой статье мы расскажем об одном из основополагающих принципов ООП, который Вам обязательно нужно понять - наследование.
Что такое наследование?
Наследование (англ. inheritance) - это механизм, позволяющий создавать классы на основе другого класса.
Так, один класс может "наследовать" характеристики другого - его методы и переменные.
- Класс, являющийся основой, называют: базовым, супер, родительским.
- Класс, который создают, называют: потомок, наследник или производный класс.
Пример
Представим, что у нас есть класс Dog. Что есть у каждой собаки? Четыре лапы, один хвост - и еще они умеют гавкать и вилять хвостом.
А теперь представим, что мы хотим создать классы для разных пород - овчарок, бульдогов и болонок.
У всех овчарок, бульдогов и болонок тоже будет четыре лапы и хвост, они тоже будут гавкать и вилять хвостом.
Конечно, мы можем просто брать и копировать эти методы и переменные в каждый класс. Но зачем? Мы можем использовать наследование.
Если мы сделаем все классы пород наследниками класса Dog, они будут иметь доступ ко всем его методам и переменным автоматически. Ну, почти ко всем.
Естественно, сама Джава тоже использует механизм наследования. Например, все классы языка наследуют класс Object, а классы ArrayList и LinkedList - класс List.
Как наследовать?
Наследование - это просто.
Для того, чтобы унаследовать класс, нужно использовать ключевое слово extends:
1 2 3 |
class Dobermann extends Dog { } |
Как видите, ключевое слово ставится после названия класса:
Правила наследования
Правило 1. Наследуем только один класс.
Java не поддерживает наследование нескольких классов. Один класс - один родитель.
Обратите внимание - нельзя наследовать самого себя!
Правило 2. Наследуется все кроме приватных переменных и методов.
Выше мы говорили, что класс-наследник будет иметь доступ ко всем переменным и методам родителя. Это не совсем так.
На самом деле, все методы и переменные, помеченные модификатором private, не доступны классу-наследнику.
Правило 3. Переделать метод класса-родителя.
Представим, что мы наследуем класс, но нам нравится не все, что мы унаследовали. Допустим мы хотим, чтобы определенный--- метод работал не так, как в родителе.
Для того, чтобы переопределить метод класса-родителя, пишем над ним @Override:
1 2 3 4 5 6 7 8 9 |
class Dobermann extends Dog { @Override public void voice() { System.out.println("Bark!"); } } |
Правило 4. Вызываем методы родителя через ключевое слово super.
Представим, что Вы хотите изменить метод родительского класса совсем чуть-чуть - буквально дописать пару строк. Тогда в своем методе мы можем вызвать родительский метод с помощью ключевого слова super.
Например, у нас есть класс Dog с методом voice():
1 2 3 4 5 |
public class Dog { public void voice(){ System.out.println("Hello World from Dog class!"); } } |
Кроме того, у нас есть класс Dobermann, который наследует класс Dog и имеет свой метод voice(). В нем мы вызываем родительский метод через ключевое слово super:
1 2 3 4 5 6 7 8 |
class Dobermann extends Dog { @Override public void voice() { super.voice(); System.out.println("Hello World from Dobermann class!"); } } |
Теперь, вызовем метод voice() из класса Dobermann:
1 2 3 4 5 6 |
public class Test { public static void main(String[] args) { Dobermann d = new Dobermann(); d.voice(); } } |
В консоли мы увидим следующее:
Таким образом, видим, что voice() сначала вызвал метод из родительского класса, а потом вывел в консоль строку "Hello World from Dobermann class!".
Правило 5. Запрещаем наследование.
Если Вы не хотите, чтобы кто-то наследовал Ваш класс, поставьте перед ним модификатор final. Например:
1 2 3 |
final class Dog { } |
Теперь попробуем создать наследника:
1 2 3 |
class Dobermann extends Dog { } |
Получим ошибку:
Надеемся, что наша статья была Вам полезна. Есть возможность записаться на наши курсы по Java. Детальнее у нас на сайте.