6

So che l'overloading utilizza il binding statico e l'override utilizza l'associazione dinamica. Ma cosa succede se sono mescolati? In base a this tutorial, per risolvere le chiamate di metodo, il binding statico utilizza le informazioni sul tipo mentre il bind dinamico utilizza le informazioni oggetto reali.caso: legame statico? legame dinamico?

Quindi, l'associazione statica si verifica nel seguente esempio per determinare quale metodo sort() da richiamare?

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: Il risultato è: Child#sort(Collection c) is invoked

+0

Qual è l'output? –

risposta

4

Ci sono due fasi di collegamento qui, come sospettavate.

In primo luogo, la fase statica, che sceglierà di chiamare sort(Collection c). Questa operazione viene eseguita in fase di compilazione e dal momento che c è un riferimento del tipo Collection, questo metodo verrà utilizzato, indipendentemente dal tipo di esecuzione (che è un HashSet).

Quindi, in runtime, dal momento che p contiene effettivamente un'istanza Child, verrà invocato il metodo e verrà ottenuto "Child#sort(Collection c) is invoked".

4

fase di compilazione, binding statico metodo con cui verrà utilizzato firma determina (raccolta vs hashset). durante l'esecuzione, VM determina su quale oggetto verrà invocato il metodo