【问题标题】:case: static binding? dynamic binding?案例:静态绑定?动态绑定?
【发布时间】:2015-09-14 03:59:31
【问题描述】:

我知道重载使用静态绑定,而覆盖使用动态绑定。 但如果它们混合在一起呢? 根据this tutorial,为了解决方法调用,静态绑定使用类型信息,而动态绑定使用实际的对象信息。

那么,下面的例子中是否发生了静态绑定来确定调用哪个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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-20
        • 1970-01-01
        • 2012-10-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多