案例:静态绑定?动态绑定?
case: static binding? dynamic binding?
我知道重载使用静态绑定,覆盖使用动态绑定。
但是,如果它们混合在一起呢?
根据 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
在编译时,静态绑定决定了使用签名的方法(集合与哈希集)。在执行过程中,VM 确定将在哪个对象上调用该方法
如您所料,这里有两个绑定阶段。
首先是静态阶段,即会选择调用sort(Collection c)
。这是在编译时完成的,并且由于 c
是 Collection
类型的引用,因此将使用此方法,而不管运行时类型(即 HashSet
)。
然后,在运行时,由于 p
实际上包含一个 Child
实例,它的方法将被调用,你将得到 "Child#sort(Collection c) is invoked"
.
我知道重载使用静态绑定,覆盖使用动态绑定。 但是,如果它们混合在一起呢? 根据 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
在编译时,静态绑定决定了使用签名的方法(集合与哈希集)。在执行过程中,VM 确定将在哪个对象上调用该方法
如您所料,这里有两个绑定阶段。
首先是静态阶段,即会选择调用sort(Collection c)
。这是在编译时完成的,并且由于 c
是 Collection
类型的引用,因此将使用此方法,而不管运行时类型(即 HashSet
)。
然后,在运行时,由于 p
实际上包含一个 Child
实例,它的方法将被调用,你将得到 "Child#sort(Collection c) is invoked"
.