Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的调用函数继承_Java_Inheritance - Fatal编程技术网

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”