6

Ich weiß, dass das Überladen statische Bindung verwendet und das Überschreiben dynamische Bindung verwendet. Aber was ist, wenn sie gemischt sind? Nach this tutorial, um Methodenaufrufe zu lösen, verwendet statische Bindung Typ Informationen, während dynamische Bindung tatsächliche Objektinformationen verwendet.Fall: statische Bindung? Dynamische Bindung?

Gibt es im folgenden Beispiel eine statische Bindung, um zu ermitteln, welche sort()-Methode aufgerufen werden soll?

public class TestStaticAndDynamicBinding { 

    @SuppressWarnings("rawtypes") 
    public static void main(String[] args) { 
     Parent p = new Child(); 
     Collection c = new HashSet(); 

     p.sort(c); 
    } 
} 

.

public class Parent { 

    public void sort(Collection c) { 
     System.out.println("Parent#sort(Collection c) is invoked"); 
    } 

    public void sort(HashSet c) { 
     System.out.println("Parent#sort(HashSet c) is invoked"); 
    } 
} 

.

public class Child extends Parent { 

    public void sort(Collection c) { 
     System.out.println("Child#sort(Collection c) is invoked"); 
    } 

    public void sort(HashSet c) { 
     System.out.println("Child#sort(HashSet c) is invoked"); 
    } 
} 

ps: Die Ausgabe ist: Child#sort(Collection c) is invoked

+0

Was ist der Ausgang? –

Antwort

4

Hier gibt es zwei Phasen der Bindung, wie Sie vermutet haben.

Zuerst die statische Phase, die wählen wird sort(Collection c) aufrufen. Dies geschieht in der Kompilierzeit, und da c eine Referenz des Typs Collection ist, wird diese Methode unabhängig vom Laufzeittyp (HashSet) verwendet.

Dann in Laufzeit, da tatsächlich eine Child Instanz enthält, wird es Methode aufgerufen, und Sie erhalten "Child#sort(Collection c) is invoked".

4

während der Kompilierung, statische Methode Bindung bestimmt, mit der Signatur verwendet wird (collection vs Hashset). Während der Ausführung ermittelt die VM, auf welchem ​​Objekt die Methode aufgerufen wird.