我知道重载使用静态绑定,覆盖使用动态绑定。 但如果他们混在一起呢? 根据{{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
答案 0 :(得分:4)
在编译期间,静态绑定确定将使用签名的方法(集合与hashset)。在执行期间,VM确定将调用该方法的对象
答案 1 :(得分:4)
这里有两个绑定阶段,正如您所怀疑的那样。
首先,静态阶段,将选择调用sort(Collection c)
。这是在编译时完成的,由于c
是Collection
类型的引用,因此将使用此方法,而不管运行时类型(HashSet
)。
然后,在运行时,由于p
实际上包含Child
实例,因此将调用它的方法,然后您将获得"Child#sort(Collection c) is invoked"
。