case:静态绑定?动态绑定?

du3*_*369 6 java polymorphism overloading dynamic-binding static-binding

我知道重载使用静态绑定和覆盖使用动态绑定.但如果他们混在一起呢?根据本教程,要解析方法调用,静态绑定使用类型信息,而动态绑定使用实际的Object信息.

那么,在以下示例中是否发生了静态绑定以确定sort()要调用的方法?

public class TestStaticAndDynamicBinding {

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

        p.sort(c);
    }
}
Run Code Online (Sandbox Code Playgroud)

.

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

.

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

ps:输出是: Child#sort(Collection c) is invoked

Mur*_*nik 4

正如您所怀疑的,这里的绑定有两个阶段。

首先是静态阶段,即会选择调用sort(Collection c)。这是在编译时完成的,并且由于c是类型的引用Collection,因此无论运行时类型如何(是 a HashSet),都将使用此方法。

然后,在运行时,由于p实际上包含一个Child实例,因此将调用它的方法,并且您将得到"Child#sort(Collection c) is invoked".