我对java还是很陌生。所以我一边玩java一边阅读多态性和静态绑定。我来这里是为了澄清我的思考过程是否正确。
class A {
void foo(A a) {
System.out.println("AAAAAA");
}
}
class B extends A {
void foo(B a) {
System.out.println("BBBBB");
}
}
class C extends B{
void foo (A a){
System.out.println("CCCCCBBBB");
}
}
我创建了以下名为“c”的对象,并以 c 作为参数调用 foo。
C c = new C();
c.foo(c); // the output is BBBBB
从这篇文章关于Java重载和动态绑定的问题,我了解到,如果在类中找不到发送的参数,它会将参数(在本例中为C)向上转换为在类中可以找到的参数(在此情况 A,因为
void foo (A a)
)。但如果是这样的话,它不应该打印“CCCCCBBBB”吗?通过静态绑定。
类
C
有 2 个重载方法,名称为 foo
// defined in the class C
void foo (A a){
System.out.println("CCCCCBBBB");
}
// inherited from the class B
void foo(B a) {
System.out.println("BBBBB");
}
当我们使用类
foo
的参数调用方法C
时,将选择最具体的一个 - B
类在层次结构上比类A
更接近,因此调用foo(B)
。