Junior
Czym są dziedziczenie i polimorfizm w typach danych referencyjnych?
sobes.tech AI
Odpowiedź od AI
Dziedziczenie to mechanizm umożliwiający nowej klasie (podklasie/klasie pochodnej) dziedziczenie właściwości (pól) i zachowań (metod) istniejącej klasy (klasy nadrzędnej/rodzica), rozszerzając lub nadpisując funkcjonalność. Sprzyja to ponownemu użyciu kodu i ustanawia relacje "jest" (is-a).
Polimorfizm to możliwość obiektów różnych klas do reagowania na tę samą nazwę metody w różny sposób, w zależności od ich konkretnego typu podczas wykonywania. Zapewnia elastyczność i rozszerzalność kodu, pozwalając na obsługę obiektów podklas przez odwołanie do klasy nadrzędnej.
W typach danych referencyjnych (klasach) te koncepcje odgrywają kluczową rolę:
- Dziedziczenie: Podklasa ma dostęp do członków klasy nadrzędnej i może dodawać własne lub zmieniać zachowanie odziedziczonych metod (nadpisanie - overriding). Obiekt podklasy może być używany wszędzie tam, gdzie oczekiwany jest obiekt klasy nadrzędnej.
- Polimorfizm: Różne obiekty związane z tą samą hierarchią dziedziczenia mogą być obsługiwane tym samym kodem, wywołując tę samą metodę, ale implementacja tej metody będzie specyficzna dla konkretnego typu obiektu podczas wykonywania.
Przykład w Java:
// Klasa nadrzędna (superklasa)
class Animal {
public void makeSound() {
System.out.println("Wydaje dźwięk");
}
}
// Klasa pochodna (podklasa), dziedzicząca po Animal
class Dog extends Animal {
// Nadpisanie metody z klasy nadrzędnej
@Override
public void makeSound() {
System.out.println("Hau!");
}
}
// Klasa pochodna (podklasa), dziedzicząca po Animal
class Cat extends Animal {
// Nadpisanie metody z klasy nadrzędnej
@Override
public void makeSound() {
System.out.println("Miau!");
}
}
// Przykład polimorfizmu
public class PolymorphismExample {
public static void main(String[] args) {
Animal myAnimal = new Animal(); // obiekt klasy nadrzędnej
Animal myDog = new Dog(); // obiekt klasy pochodnej, odwołanie do klasy nadrzędnej
Animal myCat = new Cat(); // obiekt klasy pochodnej, odwołanie do klasy nadrzędnej
myAnimal.makeSound(); // Wypisze: Wydaje dźwięk
myDog.makeSound(); // Wypisze: Hau! (polimorfizm - wywołanie metody Dog)
myCat.makeSound(); // Wypisze: Miau! (polimorfizm - wywołanie metody Cat)
}
}