Zum Hauptinhalt springen

(Dynamische) Polymorphie

Unter (dynamischer) Polymorphie (griechisch für „Vielgestaltigkeit") versteht man, dass eine Referenzvariable zur Laufzeit Referenzen auf Objekte unterschiedlicher Klassen halten kann und dadurch unterschiedliche Methodenimplementierungen aufgerufen werden. Man unterscheidet dabei zwischen dem statischen Datentyp (zur Designzeit festgelegt) und dem dynamischen Datentyp (zur Laufzeit zugewiesen). Der statische Typ bestimmt, welche Methoden aufrufbar sind; der dynamische Typ bestimmt, welche Implementierung tatsächlich ausgeführt wird. Die Typumwandlung von der Unterklasse zur Oberklasse nennt man Upcast, die Rückumwandlung Downcast.

Computer.java (Auszug)
public class Computer {
...
public ArrayList<String> getSpecification() {
ArrayList<String> specification = new ArrayList<>();
specification.add("description: " + description);
specification.add("cpu: " + cpu);
specification.add("memoryInGb: " + memoryInGb);
return specification;
}
...
}
info

Im Gegensatz zum Upcast muss bei einem Downcast der Typ explizit angegeben werden. Der Downcast einer nicht zuweisungskompatiblen Referenz führt zu einer ClassCastException.

Der instanceof-Operator

Mit dem Operator instanceof lässt sich zur Laufzeit prüfen, ob eine Objektreferenz mit einer bestimmten Klasse zuweisungskompatibel ist. Seit Java 16 ermöglicht der Mustervergleich (Pattern Matching) bei instanceof das direkte Binden in eine neue Variable ohne expliziten Downcast.

MainClass.java (Auszug)
public class MainClass {

public static void main(String[] args) {
...
for (Computer c : computers) {
// bis Java 16: expliziter Downcast erforderlich
if (c instanceof Notebook) {
Notebook notebook = (Notebook) c;
System.out.println(notebook.getScreenSizeInInches());
}
// seit Java 16: Pattern Matching
if (c instanceof Notebook notebook) {
System.out.println(notebook.getScreenSizeInInches());
}
}
...
}

}