Наследование в Java: принципы расширения классов и ключевое слово extends
Наследование — процесс, при котором один класс приобретает свойства (поля и методы) другого. Информация организуется в иерархическом порядке.
- Подкласс (subclass / derived / child) — класс, наследующий свойства.
- Суперкласс (superclass / base / parent) — класс, чьи свойства наследуются.
Ключевое слово extends
class Super { ... }
class Sub extends Super { ... }
Пример наследования
class Calculation {
int z;
public void addition(int x, int y) {
z = x + y;
System.out.println("The sum: " + z);
}
public void Subtraction(int x, int y) {
z = x - y;
System.out.println("The difference: " + z);
}
}
public class My_Calculation extends Calculation {
public void multiplication(int x, int y) {
z = x * y;
System.out.println("The product: " + z);
}
public static void main(String args[]) {
int a = 20, b = 10;
My_Calculation demo = new My_Calculation();
demo.addition(a, b);
demo.Subtraction(a, b);
demo.multiplication(a, b);
}
}
Результат:
The sum of the given numbers: 30
The difference between the given numbers: 10
The product of the given numbers: 200
При создании объекта подкласса копия суперкласса создаётся внутри него. Поэтому через объект подкласса доступны члены суперкласса.
Ссылка суперкласса на объект подкласса
Calculation demo = new My_Calculation();
demo.addition(a, b); // OK
demo.Subtraction(a, b); // OK
// demo.multiplication(a, b); // ОШИБКА: метод есть только в подклассе
Рекомендуется использовать ссылку подкласса для доступа ко всем членам.
Ключевое слово super
Аналог this, но для суперкласса. Используется для:
- Разрешения конфликта имён:
super.variable,super.method() - Вызова конструктора суперкласса:
super(значения)
Пример: дифференциация членов
class Super_class {
int num = 20;
public void display() { System.out.println("Superclass display"); }
}
public class Sub_class extends Super_class {
int num = 10;
public void display() { System.out.println("Subclass display"); }
public void my_method() {
Sub_class sub = new Sub_class();
sub.display();
super.display();
System.out.println("Sub num: " + sub.num);
System.out.println("Super num: " + super.num);
}
public static void main(String args[]) {
new Sub_class().my_method();
}
}
Результат:
Subclass display
Superclass display
Sub num: 10
Super num: 20
Пример: вызов параметризованного конструктора суперкласса
class Superclass {
int age;
Superclass(int age) { this.age = age; }
public void getAge() { System.out.println("Age in super: " + age); }
}
public class Subclass extends Superclass {
Subclass(int age) { super(age); }
public static void main(String args[]) {
Subclass s = new Subclass(24);
s.getAge();
}
}
Результат: The value of the variable named age in super class is: 24
Отношение IS-A
extends реализует отношение IS-A («является»):
class Animal {}
class Mammal extends Animal {}
class Reptile extends Animal {}
class Dog extends Mammal {}
- Mammal IS-A Animal
- Dog IS-A Mammal → Dog IS-A Animal
Проверка через instanceof:
Animal a = new Animal();
Mammal m = new Mammal();
Dog d = new Dog();
System.out.println(m instanceof Animal); // true
System.out.println(d instanceof Mammal); // true
System.out.println(d instanceof Animal); // true
Ключевое слово implements
Используется для реализации интерфейсов. Класс не может расширить несколько классов, но может реализовать несколько интерфейсов.
interface Animal {}
class Mammal implements Animal {}
class Dog extends Mammal {}
Отношение HAS-A
Класс содержит экземпляр другого класса (композиция). Уменьшает дублирование кода.
class Vehicle {}
class Speed {}
class Van extends Vehicle {
private Speed sp; // Van HAS-A Speed
}
Типы наследования
Java поддерживает:
- Одиночное (single)
- Многоуровневое (multilevel)
- Иерархическое (hierarchical)
Множественное наследование классов НЕ поддерживается (class cannot extend multiple classes). Но класс может реализовывать несколько интерфейсов.
java
- Ключевое слово final в Java: переменные, методы и классы
- Оператор instanceof в Java: полное руководство с примерами
- Статические вложенные классы в Java: использование, отличия и примеры
- Анонимные внутренние классы в Java: определение, синтаксис и практические примеры
- Паттерн Singleton в Java: как реализовать и безопасно использовать
- Рефлексия в Java: инспекция классов, методов и полей во время выполнения
- Освоение Java ObjectOutputStream: сериализация, методы и практические примеры
- Освоение Java Generics: создание переиспользуемого, типобезопасного кода
- Мастерство файловых операций в Java с java.io: создание, чтение, запись и удаление
- Наследование в C#: базовые и производные классы, интерфейсы