java - 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。为什么会这样
解决方案
Java 编译器对作为参数传递的参数类型使用静态绑定。这决定了在变量类型的类中调用哪个重载,here A
。
ab
is的静态类型,因此唯一匹配的A
命名方法是。show
show(A)
JVM 对调用方法的对象的运行时类型使用动态绑定。这决定了调用哪个覆盖。这就是多态性。
的运行时类型ab
是B
. 有一个show(A)
in的覆盖B
,所以这是被调用的方法,它打印“B 和 A”。
推荐阅读
- java - Rust 与 Java 静态方法以及对泛型类型参数的调用
- c++ - 如何创建从相同基类继承并具有独特功能的对象向量?
- python - 多个图像numpy数组成块
- python - 时间戳重采样和附加值
- javascript - 如何在前端应用程序中组织 api 请求?
- typescript - 无服务器不包括 lambda 函数中的 node_modules
- mongodb - 如何在 MongoDB 中使用 db.collection.findOne 函数和 pretty?
- python - 如何在 Python 中创建一个修改变量的内联函数?
- firebase - 如何使用 Firebase Auth REST API 在模拟器中创建用户
- javascript - 如何在javascript中删除通知权限?