java中的调用函数继承
我编写了如下代码java中的调用函数继承,java,inheritance,Java,Inheritance,我编写了如下代码 class A { public String show (D obj) { return ("A and D"); } public String show (A obj) { return ("A and A"); } } class B extends A { public String show(B obj) { return ("B and B"); } @Ove
class A {
public String show (D obj) {
return ("A and D");
}
public String show (A obj) {
return ("A and A");
}
}
class B extends A {
public String show(B obj) {
return ("B and B");
}
@Override
public String show(A obj) {
return ("B and A");
}
}
class Solution {
public static void main(String[] args) {
A ab = new B();
B b = new B();
System.out.println(ab.show(b));
}
}
结果是B和A。我不明白为什么它不是B和B,因为B是一个B对象。但如果我改变
A ab=新的B()到B ab=新的B()
结果将是B和B。为什么这是因为
ab
是A
,它称为虚拟A.show
,但既然ab
实际上是一个B
,实际调用的方法是B
对原始A
的虚拟方法的重写。Java编译器对作为参数传递的参数类型使用静态绑定。这决定了在变量类型的类中调用哪个重载,这里是A
ab
的静态类型是A
,因此名为show
的唯一匹配方法是show(A)
JVM对调用方法的对象的运行时类型使用动态绑定。这将确定调用哪个覆盖。这是多态性
ab
的运行时类型是B
。在B
中有一个对show(A)
的重写,因此调用的方法将打印“B和A”