Polymorphismus (Java) - dynamisches Binden wie vorgehen?
An sich verstehe ich bei mir an der Uni die Aufgaben mit Polymorphismus, aber mir bereiten immer wieder die Fälle Probleme, wo ein "gemischtes Objekt " erzeugt wird wie in diesem Beispiel in Zeile 21 und die damit verbundenden Methodenaufrufe 24, 25 und 28. Wie macht man das da?
1 Antwort
Hier kommt die dynamische Bindung zum Tragen. Sobald die Methode aufgerufen wird, wird der konkrete Typ des Objekts ermittelt und von diesem die konkreteste Implementation der Methode aufgerufen, die ihm zur Verfügung steht. Dabei wird die Objekthierarchie betrachtet, die zwischem dem abstrakten und dem konkreten Typ steht.
Beispiel:
class Animal {
void makeSound() {
}
}
class Felidae extends Animal {
void makeSound() {
System.out.println("*Some hissing sounds*");
}
}
class Lion extends Felidae {
void makeSound() {
System.out.println("Roar");
}
}
class Panther extends Felidae {
}
// main:
Animal leo = new Lion();
leo.makeSound(); // Roar
Animal bagheera = new Panther();
bagheera.makeSound(); // *Some hissing sounds*
Felidae simba = new Lion();
simba.makeSound(); // Roar
Bei leo handelt es sich um eine Variable des Typs Animal (abstrakter Typ), die auf ein Lion-Objekt (konkreter Typ) verweist. Da der Lion-Typ die makeSound-Methode überschreibt, wird auch diese Implementation aufgerufen.
Bei bagheera handelt es sich um eine Variable des Typs Animal (abstrakter Typ), die auf ein Panther-Objekt (konkreter Typ) verweist. Die nächstliegende konkrete Implementation von makeSound befindet sich in seiner Elternklasse Felidae, die sich innerhalb der Objekthierarchie der benannten Typen befindet. Bei Aufruf wird sie ausgeführt. Würde die Elternklasse diese Methode nicht überschreiben, würde die Implementation aus der Animal-Klasse genutzt werden.
Bei simba wird erneut auf ein Lion-Objekt verwiesen und du würdest dasselbe Ergebnis wie im ersten Fall erhalten. Würde die Methode in Lion nicht überschrieben werden, würde die Implementation der Elternklasse genutzt werden. Da die Variable diesmal vom Typ Felidae ist, gehören nur Felidae und Lion zur betrachteten Objekthierarchie.
Für deine Aufgabe musst du folgendermaßen auch immer nur schauen, was der konkrete sowie der abstrakte Typ ist und wo in deren Objekthierarchie die nächstliegende Implementation der Methode liegt. Die Suche startet dabei immer von unten (dem konkretesten Typ).