Автор оригинала: 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.
- Если вы не собираетесь использовать суперкласс в коде, то есть ваш суперкласс-это просто база для хранения повторно используемого кода, тогда вы можете сохранить их как Абстрактный класс , чтобы избежать ненужного создания экземпляров клиентскими классами. Это также ограничит создание экземпляра базового класса.