Czym są dziedziczenie i polimorfizm w kontekście typów danych referencyjnych?
sobes.tech AI
Odpowiedź od AI
Dziedziczenie to mechanizm umożliwiający tworzenie nowej klasy (pochodnej, potomnej), która dziedziczy pola i metody istniejącej klasy (bazowej, rodzica). To sprzyja ponownemu użyciu kodu i tworzeniu hierarchii klas.
Polimorfizm to możliwość obiektów różnych klas do zachowywania się jednolicie lub do posiadania różnych zachowań podczas wywoływania tej samej metody. Wyróżnia się dwa główne rodzaje: statyczny (przeciążanie metod) i dynamiczny (nadpisywanie metod).
W kontekście typów danych referencyjnych, dziedziczenie pozwala na utworzenie zmiennej klasy bazowej, która może odwoływać się do obiektu klasy pochodnej. W tym przypadku polimorfizm objawia się tym, że podczas wywoływania metody przez taką zmienną, wykonywana jest wersja metody z rzeczywistego typu obiektu, a nie z typu odwołania (polimorfizm dynamiczny).
Przykład w Java:
// Klasa bazowa
class Animal {
public void makeSound() {
System.out.println("Wydaje dźwięk");
}
}
// Klasa pochodna 1
class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Hau hau");
}
}
// Klasa pochodna 2
class Cat extends Animal {
@Override
public void makeSound() {
System.out.println("Miau miau");
}
}
class Main {
public static void main(String[] args) {
Animal myDog = new Dog(); // Zmienna typu Animal odwołująca się do obiektu Dog
Animal myCat = new Cat(); // Zmienna typu Animal odwołująca się do obiektu Cat
myDog.makeSound(); // Wywołuje metodę z Dog (polimorfizm)
myCat.makeSound(); // Wywołuje metodę z Cat (polimorfizm)
}
}
W tym przykładzie, myDog i myCat mają typ odwołania Animal, ale dzięki polimorfizmowi, podczas wywołania makeSound(), wykonywana jest odpowiednia implementacja z Dog i Cat.