Какво е наследяване и полиморфизъм в референтните типове данни?
sobes.tech AI
Отговор от AI
Наследяването е механизъм, който позволява на нов клас (наследник, подклас, подкласа) да наследява полета и методи на съществуващ клас (родителски клас, суперклас). Това насърчава повторното използване на кода и йерархията на класовете.
Полиморфизмът (многообразие на формите) е способността на обект да има няколко форми. В контекста на референтните типове данни това означава, че променлива от суперклас може да сочи към обект от подклас. Това позволява обработката на обекти от различни подкласове по унифициран начин чрез общ интерфейс или суперклас.
Има два основни вида полиморфизъм:
- Време на компилация (статичен полиморфизъм): Обикновено се постига чрез презаписване на методи (method overloading), когато в един клас има няколко метода със същото име, но различни сигнатури (брой и/или типове параметри).
- Време на изпълнение (динамичен полиморфизъм): Постигат се чрез презаписване на методи (method overriding), когато подклас предоставя своя реализация на метод, вече дефиниран в суперклас. При извикване на такъв метод чрез препратка към суперклас, ще бъде изпълнена реализацията на подклас (ако типът на обекта е подклас).
Пример за наследяване и динамичен полиморфизъм:
// Базов клас
class Animal {
public void makeSound() {
System.out.println("Общ звук на животно");
}
}
// Клас-наследник
class Dog extends Animal {
@Override // Презаписване на метода
public void makeSound() {
System.out.println("Уф!");
}
}
// Клас-наследник
class Cat extends Animal {
@Override // Презаписване на метода
public void makeSound() {
System.out.println("Мяу!");
}
}
public class Main {
public static void main(String[] args) {
// Статичен тип на променливата Animal, динамичен тип на обекта Dog
Animal myDog = new Dog();
// Статичен тип на променливата Animal, динамичен тип на обекта Cat
Animal myCat = new Cat();
// Статичен тип на променливата Animal, динамичен тип на обекта Animal
Animal genericAnimal = new Animal();
// Демонстрация на полиморфизма
myDog.makeSound(); // Ще извика метода от Dog
myCat.makeSound(); // Ще извика метода от Cat
genericAnimal.makeSound(); // Ще извика метода от Animal
}
}
В този пример Dog и Cat наследяват от Animal. Променливите myDog, myCat и genericAnimal имат статичен тип Animal, но сочат към обекти от различни динамични типове (Dog, Cat, Animal). При извикване на метода makeSound(), във всеки случай се изпълнява съответната реализация на метода в зависимост от динамичния тип на обекта, което е полиморфизм на време на изпълнение.