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
正如您所怀疑的,这里的绑定有两个阶段。
首先是静态阶段,即会选择调用sort(Collection c)。这是在编译时完成的,并且由于c是类型的引用Collection,因此无论运行时类型如何(是 a HashSet),都将使用此方法。
然后,在运行时,由于p实际上包含一个Child实例,因此将调用它的方法,并且您将得到"Child#sort(Collection c) is invoked".
| 归档时间: |
|
| 查看次数: |
187 次 |
| 最近记录: |