Sobes.tech
Middle

Какво е наследяване и полиморфизъм в референтните типове данни?

sobes.tech AI

Отговор от AI

Наследяването е механизъм, който позволява на нов клас (наследник, подклас, подкласа) да наследява полета и методи на съществуващ клас (родителски клас, суперклас). Това насърчава повторното използване на кода и йерархията на класовете.

Полиморфизмът (многообразие на формите) е способността на обект да има няколко форми. В контекста на референтните типове данни това означава, че променлива от суперклас може да сочи към обект от подклас. Това позволява обработката на обекти от различни подкласове по унифициран начин чрез общ интерфейс или суперклас.

Има два основни вида полиморфизъм:

  1. Време на компилация (статичен полиморфизъм): Обикновено се постига чрез презаписване на методи (method overloading), когато в един клас има няколко метода със същото име, но различни сигнатури (брой и/или типове параметри).
  2. Време на изпълнение (динамичен полиморфизъм): Постигат се чрез презаписване на методи (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(), във всеки случай се изпълнява съответната реализация на метода в зависимост от динамичния тип на обекта, което е полиморфизм на време на изпълнение.