6

Я знаю, что перегрузка использует статическое связывание и переопределение использует динамическое связывание. Но что, если они смешаны? В соответствии с this tutorial для разрешения вызовов методов статическая привязка использует информацию о типе, тогда как динамическое связывание использует фактическую информацию об объекте.case: статическая привязка? динамическое связывание?

Итак, статическое связывание происходит в следующем примере, чтобы определить, какой метод sort() вызывать?

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"); 
    } 
} 

пс: Выход: Child#sort(Collection c) is invoked

+0

Какой выход? –

ответ

4

Здесь, как вы подозревали, существует две фазы привязки.

Во-первых, статическая фаза, которая выберет для вызова sort(Collection c). Это делается во время компиляции, и поскольку c является ссылкой типа Collection, этот метод будет использоваться независимо от типа времени выполнения (который является HashSet).

Затем, во время выполнения, с p фактически содержит экземпляр Child, будет вызываться метод, и вы получите "Child#sort(Collection c) is invoked".

4

во время компиляции, статическое связывание определяет метод, с которым будет использоваться подпись (сбор против HashSet). во время выполнения VM определяет, на каком объекте будет вызываться метод.

 Смежные вопросы

  • Нет связанных вопросов^_^