我是Java世界的新手,我在确定Java何时存在多态时决定调用哪个方法时遇到了一些问题。你能帮我弄清楚这个例子是如何工作的吗? 我尝试了代码并看到了结果。我更感兴趣的是它为什么会这样工作。
class A {
void redef(A a) { System.out.println("[A]"); }
}
class B extends A {
//@Override
void redef(B b) { System.out.println("[B]"); }
}
class C extends B {
}
public class Surcharge {
static void surcharge(A a) { System.out.println("[A]"); }
static void surcharge(B b) { System.out.println("[B]"); }
public static void main(String[] argv) {
A a = new A() ;
B b = new B() ;
A ab = new B();
C c = new C();
ab.redef(c); //?
surcharge(a); //?
surcharge(b); //?
surcharge(c); //?
surcharge(ab); //?
}
}
答案 0 :(得分:0)
当一个方法被重载时(就像这里的所有方法一样),Java使用的方法与声明的参数类型最匹配。
在第一个示例中,对象(ab
)是声明类型A的,编译器只知道方法redef(A a)
,因此它被选中。
请注意,方法redef(B)
不会覆盖方法redef(A)
,因为它的签名不匹配。如果取消注释@Override
注释,则会出现编译错误。
在第二个例子中,只有sucharge(A a)
与声明的参数类型(A)匹配,因此选择了这个。
在第三个例子中,surcharge(B b)
更接近地匹配参数(B)的声明类型,因此它被选中。
第四个例子相同。
在上一个示例中,只有surcharge(A a)
适用于声明的参数类型(A),因此选择它。