首页 > 解决方案 > java调用函数继承

问题描述

我写过类似的代码

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 = new B() 更改为 B ab = new B() 结果将是 B 和 B。为什么会这样

标签: javainheritance

解决方案


Java 编译器对作为参数传递的参数类型使用静态绑定。这决定了在变量类型的类中调用哪个重载,here A

abis的静态类型,因此唯一匹配的A命名方法是。showshow(A)

JVM 对调用方法的对象的运行时类型使用动态绑定。这决定了调用哪个覆盖。这就是多态性。

的运行时类型abB. 有一个show(A)in的覆盖B,所以这是被调用的方法,它打印“B 和 A”。


推荐阅读