Автор оригинала: Pankaj Kumar.
Наследование в java является одной из основных концепций Объектно-ориентированного программирования . Наследование Java используется, когда у нас есть is-a связь между объектами. Наследование в Java реализовано с использованием ключевого слова extends
.
Наследование в Java
Наследование в Java-это метод создания иерархии между классами путем наследования от других классов.
Наследование Java является переходным – поэтому , если Седан расширяет автомобиль
и Автомобиль расширяет автомобиль
, то седан также наследуется от класса транспортного средства. Транспортное средство становится суперклассом как легкового автомобиля, так и седана.
Наследование широко используется в приложениях Java, например, расширение класса исключений для создания класса исключений для конкретного приложения, содержащего дополнительную информацию, такую как коды ошибок. Например, исключение NullPointerException .
Пример наследования Java
Каждый класс в java неявно расширяет java.lang.Объект
класс. Таким образом, класс объектов находится на верхнем уровне иерархии наследования в java.
Давайте посмотрим, как реализовать наследование в java на простом примере.
Суперкласс: Животное
package com.journaldev.inheritance; public class Animal { private boolean vegetarian; private String eats; private int noOfLegs; public Animal(){} public Animal(boolean veg, String food, int legs){ this.vegetarian = veg; this.eats = food; this.noOfLegs = legs; } public boolean isVegetarian() { return vegetarian; } public void setVegetarian(boolean vegetarian) { this.vegetarian = vegetarian; } public String getEats() { return eats; } public void setEats(String eats) { this.eats = eats; } public int getNoOfLegs() { return noOfLegs; } public void setNoOfLegs(int noOfLegs) { this.noOfLegs = noOfLegs; } }
Животное здесь является базовым классом. Давайте создадим класс Cat, который наследуется от класса Animal.
Подкласс: Может
package com.journaldev.inheritance; public class Cat extends Animal{ private String color; public Cat(boolean veg, String food, int legs) { super(veg, food, legs); this.color="White"; } public Cat(boolean veg, String food, int legs, String color){ super(veg, food, legs); this.color=color; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } }
Обратите внимание, что мы используем ключевое слово extends
для реализации наследования в java.
Программа тестирования наследования Java
Давайте напишем простой тестовый класс для создания объекта Cat и используем некоторые из его методов.
package com.journaldev.inheritance; public class AnimalInheritanceTest { public static void main(String[] args) { Cat cat = new Cat(false, "milk", 4, "black"); System.out.println("Cat is Vegetarian?" + cat.isVegetarian()); System.out.println("Cat eats " + cat.getEats()); System.out.println("Cat has " + cat.getNoOfLegs() + " legs."); System.out.println("Cat color is " + cat.getColor()); } }
Вывод программы наследования Java
Вывод вышеуказанной программы показан на рисунке ниже.
Класс Cat не имеет метода getEats ()
, но все равно он работает, потому что унаследован от класса Animal.
Важные моменты наследования Java
- Повторное использование кода является наиболее важным преимуществом наследования, поскольку подклассы наследуют переменные и методы суперкласса.
- Частные члены суперкласса не доступны напрямую подклассу. Как и в этом примере, переменная Animal no Of Legs недоступна классу Cat, но она может быть косвенно доступна с помощью методов getter и setter.
- Члены суперкласса с доступом по умолчанию доступны подклассу ТОЛЬКО в том случае, если они находятся в одном пакете.
- Суперкласс конструкторы не наследуются подклассом.
- Если у суперкласса нет конструктора по умолчанию, то для подкласса также должен быть определен явный конструктор. В противном случае это вызовет исключение времени компиляции. В конструкторе подкласса вызов конструктора суперкласса в этом случае является обязательным и должен быть первым оператором в конструкторе подкласса.
- Java не поддерживает множественное наследование , подкласс может расширять только один класс. Класс Animal неявно расширяет класс объектов, а Cat расширяет класс животных, но из-за транзитивной природы наследования java класс Cat также расширяет класс объектов.
Мы можем создать экземпляр подкласса, а затем назначить его переменной суперкласса, это называется восходящая передача . Ниже приведен простой пример трансляции:
Когда экземпляр Суперкласса присваивается переменной подкласса, он называется понижающая передача . Нам нужно явно отнести это к подклассу. Например;
Обратите внимание, что компилятор не будет жаловаться, даже если мы делаем это неправильно из-за явного приведения. Ниже приведены некоторые из случаев, когда он будет вызывать
ClassCastException
во время выполнения.- Мы можем переопределить метод Суперкласса в Подклассе. Однако мы всегда должны аннотировать переопределенный метод с помощью @Переопределить аннотацию . Компилятор будет знать, что мы переопределяем метод, и если что-то изменится в методе суперкласса, мы получим ошибку во время компиляции, а не получим нежелательные результаты во время выполнения.
- Мы можем вызвать методы суперкласса и получить доступ к переменным суперкласса, используя ключевое слово super . Это удобно, когда у нас есть переменная/метод с одинаковым именем в подклассе, но мы хотим получить доступ к переменной/методу суперкласса. Это также используется, когда конструкторы определены в суперклассе и подклассе, и мы должны явно вызвать конструктор суперкласса.
Мы можем использовать инструкцию
instanceof
для проверки наследования между объектами, давайте рассмотрим это на примере ниже.- Мы не можем расширять конечные классы на java.
- Если вы не собираетесь использовать суперкласс в коде, то есть ваш суперкласс-это просто база для хранения повторно используемого кода, тогда вы можете сохранить их как Абстрактный класс , чтобы избежать ненужного создания экземпляров клиентскими классами. Это также ограничит создание экземпляра базового класса.