In Java wird beim Überschreiben einer Klasse mit einer Vererbungs- / Implementierungsbeziehung der Typ zur Laufzeit bestimmt und die Methode aufgerufen. Bei Überlastung habe ich jedoch versucht herauszufinden, welche Methode aufgerufen wird.
Schnittstelle
public interface OInterface {
public void printClassname();
}
** Elternklasse **
public class OParent {
public void printClassname() {
System.out.println("called:OParent=>printClassname()");
}
}
** Untergeordnete Klasse (Implementierungsschnittstelle) **
public class OChild extends OParent implements OInterface {
@Override
public void printClassname() {
System.out.println("called:OChild=>printClassname()");
}
}
** Ausführungscode **
public class OverloadMain {
public static void main(String[] args) {
OverloadMain main = new OverloadMain();
OChild child = new OChild();
OParent parent = new OChild();
OInterface iface = new OChild();
main.overloadMethod(child); // (1)
System.out.println("----");
main.overloadMethod(parent); // (2)
System.out.println("----");
main.overloadMethod(iface); // (3)
}
public void overloadMethod(OChild child) {
System.out.println("called:overloadMethod(OChild)");
child.printClassname();
}
public void overloadMethod(OParent parent) {
System.out.println("called:overloadMethod(OParent)");
parent.printClassname();
}
public void overloadMethod(OInterface iface) {
System.out.println("called:overloadMethod(OInterface)");
iface.printClassname();
}
}
** Prognose ** Vorhersage 1. Alle (1) bis (3) heißen overloadMethod (OChild child) (wie Override). Vorhersage 2. In (1) bis (3) wird die Methode des deklarierten Typs aufgerufen.
** Ausführungsergebnis **
called:overloadMethod(OChild)
called:OChild=>printClassname()
----
called:overloadMethod(OParent)
called:OChild=>printClassname()
----
called:overloadMethod(OInterface)
called:OChild=>printClassname()
Vorhersage 2. In (1) bis (3) wird die Methode des deklarierten Typs aufgerufen. war Überladung wird beim Kompilieren entschieden, nicht wahr?