English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
В этом руководстве мы будем изучать наследование в Java с помощью примеров.
Создание наследования — одна из важнейших функций ООП (ориентированного на объекты программирования), которая позволяет нам определять новый класс на основе существующего. Например:
class Animal } // метод eat() // метод sleep() } class Dog extends Animal } // bark() метод }
В Java мы используем ключевое слово extends для наследования от класса. Здесь, мы наследуем класс Dog от класса Animal.
Animal является суперклассом (родительским классом или базовым классом), а Dog является подклассом (дочерним классом или производным классом). Подкласс наследует поля и методы суперкласса.
Наследование являетсяis-aОтношения, мы используем наследование только когда два класса имеют отношение is-a.
Вот несколько примеров:
Автомобиль является транспортным средством.
Оранжевый является фрукт.
Хирург является врачом.
Собака является животным.
class Animal { public void eat() { System.out.println("Я могу есть"); } public void sleep() { System.out.println("Я могу спать"); } } class Dog extends Animal { public void bark() { System.out.println("Я могу лаять"); } } class Main { public static void main(String[] args) { Dog dog1 = new Dog(); dog1.eat(); dog1.sleep(); dog1.bark(); } }
Результат вывода
Я могу есть Я могу спать Я могу лаять
Здесь, мы наследуем класс Dog из класса Animal. Класс Dog наследует методы eat() и sleep() от класса Animal.
Таким образом, объекты класса Dog могут访问 члены класса Dog и Animal.
Мы уже рассмотрели модификаторы доступа private и public в предыдущем уроке.
Члены private могут быть доступны только в классе
Публичные члены могут быть доступны из любого места
Вы также можете установить методы и поля как protected, защищенные члены могут быть доступны
Внутри класса
В подклассе
Внутри одного пакета
Это резюме, в котором можно посетить модификаторы доступа.
Модификатор | Класс | Пакет | Дочерний класс | Глобальный |
---|---|---|---|---|
public | Да | Да | Да | Да |
private | Да | Нет | Нет | Нет |
protected | Да | Да | Да | Нет |
class Animal { protected String type; private String color; public void eat() { System.out.println("Я могу есть"); } public void sleep() { System.out.println("Я могу спать"); } public String getColor(){ return color; } public void setColor(String col){ color = col; } } class Dog extends Animal { public void displayInfo(String c){ System.out.println("Я " + type); System.out.println("Мой цвет " + c); } public void bark() { System.out.println("Я могу лаять"); } } class Main { public static void main(String[] args) { Dog dog1 = new Dog(); dog1.eat(); dog1.sleep(); dog1.bark(); dog1.type = "mammal"; dog1.setColor("black"); dog1.displayInfo(dog1.getColor()); } }
Результат вывода
Я могу есть Я могу спать Я могу лаять Я млекопитающее Мой цвет черный
Здесь, полей типа в классе Animal защищены. Мы уже访问или это поле из класса Main
dog1.type = "mammal";
Это可实现, 因为Animal и Main классы находятся в одном пакете (в одном файле).
Из上面的 примера我们知道, что объект подкласса также может вызывать методы своего суперкласса.
Что会发生, если в суперклассе и подклассе определен один и тот же метод?
Хорошо, в этом случае метод в подклассе заменяет метод в суперклассе. Например,
class Animal { protected String type = "animal"; public void eat() { System.out.println("Я могу есть"); } public void sleep() { System.out.println("Я могу спать"); } } class Dog extends Animal { @Override public void eat() { System.out.println("Я ечу корм для собак"); } public void bark() { System.out.println("Я могу лаять"); } } class Main { public static void main(String[] args) { Dog dog1 = new Dog(); dog1.eat(); dog1.sleep(); dog1.bark(); } }
Результат вывода
Я ечу корм для собак Я могу спать Я могу лаять
Здесь метод eat() появляется как в суперклассе Animal, так и в подклассе Dog. Мы создали объект подкласса Dog dog1.
Когда мы вызываем метод eat() через объект dog1, вызывается метод в Dog, а не метод в суперклассе. Это называется переписыванием методов.
В上面的 программе мы использовали аннотацию @Override, чтобы сообщить компилятору, что мы переписываем метод. Но это не обязательно. В следующем уроке мы详细了解Переписывание методов.
Если нужно вызывать метод eat() из подкласса Animal, используйте ключевое слово super.
class Animal { public Animal() { System.out.println("Я животное"); } public void eat() { System.out.println("Я могу есть"); } } class Dog extends Animal { public Dog(){ super(); System.out.println("Я собака"); } @Override public void eat() { super.eat(); System.out.println("Я ечу корм для собак"); } public void bark() { System.out.println("Я могу лаять"); } } class Main { public static void main(String[] args) { Dog dog1 = new Dog(); dog1.eat(); dog1.bark(); } }
Результат вывода
Я животное Я собака Я могу есть Я ечу корм для собак Я могу лаять
Здесь мы используем суперключ super() для вызова конструктора. Кроме того, мы используем super.eat() для вызова метода eat() суперкласса Animal.
Внимание: различие в вызове конструктора и super метода. Для получения更多信息 посетитеJava суперключ.
Наследование имеет пять типов.
Единственное наследование - Класс B наследуется только от класса A.
Многоуровневое наследование - Класс B наследуется от класса A, затем класс C наследуется от класса B.
Уровневое наследование - Класс A является родителем для B, C и D.
Множественное наследование - Класс C наследуется от интерфейса A и расширяется B.
Комбинированное наследование - Два или несколько.Наследование.Комбинированное.
Java не поддерживает множественное наследование классов и комбинированное наследование. Однако мы можем реализовать множественное наследование в Java через интерфейсы. Мы узнаем о интерфейсах в后面的 главах.
Самое важное применение - это повторное использование кода. Код, существующий в суперклассе, не нужно повторно писать в подклассе.
С помощью метода перегрузки достигается многообразие в czasie выполнения. В后面的 главах мы будем изучать больше о полиморфизме.