Polymorphismus (Java) - dynamisches Binden wie vorgehen?

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).