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

时间:2015-06-27 06:48:43

标签: java polymorphism overloading dynamic-binding static-binding

我知道重载使用静态绑定,覆盖使用动态绑定。 但如果他们混在一起呢? 根据{{​​3}},要解析方法调用,静态绑定使用类型信息,而动态绑定使用实际的对象信息。

那么,在以下示例中是否发生静态绑定以确定要调用的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");
    }
}

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

2 个答案:

答案 0 :(得分:4)

在编译期间,静态绑定确定将使用签名的方法(集合与hashset)。在执行期间,VM确定将调用该方法的对象

答案 1 :(得分:4)

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

首先,静态阶段,将选择调用sort(Collection c)。这是在编译时完成的,由于cCollection类型的引用,因此将使用此方法,而不管运行时类型(HashSet)。

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