Historie der Frage:
Polymorphismus ist eines der zentralen Prinzipien der objektorientierten Programmierung (OOP), welches in Java seit ihrer Schaffung unterstützt wird. Es ermöglicht einem Objekt, sich je nach seinem tatsächlichen Typ zur Laufzeit des Programms unterschiedlich zu verhalten, selbst wenn ein Verweis auf den Basistyp verwendet wird.
Problem:
Ohne Polymorphismus wird der Code unflexibel, häufig entstehen überflüssige Konstrukte wie switch-case oder if-else für die Arbeit mit Objekten unterschiedlicher Typen. Dies erschwert die Wartung und Erweiterung des Codes. Polymorphismus löst das Problem der Notwendigkeit, sich wiederholenden Code für verschiedene Typen zu schreiben.
Lösung:
Polymorphismus in Java wird durch Vererbung und Interfaces realisiert. Er ermöglicht:
Beispielcode:
class Animal { void speak() { System.out.println("Animal spricht"); } } class Dog extends Animal { @Override void speak() { System.out.println("Hund bellt"); } } class Cat extends Animal { @Override void speak() { System.out.println("Katze miaut"); } } public class PolyDemo { public static void main(String[] args) { Animal a1 = new Dog(); Animal a2 = new Cat(); a1.speak(); // Hund bellt a2.speak(); // Katze miaut } }
Wesentliche Merkmale:
Was ist der Unterschied zwischen Überladung (Overloading) und Überschreibung (Overriding) von Methoden im Polymorphismus?
Überladung ist die Definition mehrerer Methoden mit demselben Namen, aber unterschiedlicher Signatur innerhalb einer Klasse. Überschreibung ist die Definition einer Methode in der Unterklasse mit derselben Signatur wie in der Basisklasse.
class Example { void foo(int x) {} void foo(String y) {} // das ist Überladung } class Base { void foo() {} } class Child extends Base { @Override void foo() {} // das ist Überschreibung }
Kann es Polymorphismus ohne Vererbung geben?
Im klassischen Verständnis in Java - nein: Polymorphismus erfordert eine Vererbungshierarchie oder ein implementiertes Interface.
Kann man Methoden der Unterklasse über einen Verweis auf die Basisklasse aufrufen?
Man kann nur die Methoden aufrufen, die in der Basisklasse definiert sind oder in der Unterklasse überschrieben wurden. Methoden, die nur in der Unterklasse existieren, können nicht ohne Typumwandlung aufgerufen werden.
Animal a = new Dog(); a.speak(); // funktioniert // a.fetch(); // Kompilierungsfehler, selbst wenn Dog eine Methode fetch() hat
Im Projekt wurden die Klassen Dog, Cat, Cow implementiert, aber der verwendete Code arbeitete direkt mit den Typen, indem er Methoden über explizite Umwandlungen und instanceof aufrief:
Vorteile:
Nachteile:
Vererbung von Animal mit virtueller speak(). Alle Interaktionen über den Basistyp Animal.
Vorteile:
Nachteile: