In polymorphen Sprachen kann bei überschriebenen Methoden erst zur Laufzeit festgestellt werden, welche Methode aufgerufen wird (dynamic method lookup):
class UnterUndOber { Ober a[] = new Ober[100]; for (int i = 0; i < a.length; i++) a[i] = prim(i) ? new Ober() : new Unter(); for (int i = 0; i < a.length; i++) a[i].WhoAreYou(); }
Obwohl in mancher Hinsicht ähnlich, gibt es zwischen überschriebenen Methoden und verdeckten Attributen oder Klassenmethoden wichtige Unterschiede:
class Ober { String id = "ooo"; String WhoAreYou() { return "Ober"; } } class Unter extends Ober { String id = "uuu"; String WhoAreYou() { return "Unter"; } void identify() { Unter u = new Unter(); Ober o = u; System.out.println(o.id); System.out.println(u.id); System.out.println(o.WhoAreYou()); System.out.println(u.WhoAreYou()); }
Ausgabe von new Unter().identify():
ooo uuu Unter Unter