java - Java中的动态绑定与子类
问题描述
interface I {
public void m1();
public void m3();
}
class A implements I {
public void m1() {
System.out.println("A.m1");
this.m2(this);
}
public void m2(I obj) {
System.out.println("A.m2");
obj.m3();
}
public void m3() {
System.out.println("A.m3");
}
}
public class B extends A {
public void m2(I obj) {
System.out.println("B.m2");
super.m2(obj);
}
public void m3() {
System.out.println("B.m3");
}
public static void main(String[] args){
I obj = new B();
obj.m1();
}
}
调用方法时,java 编译器首先检查 obj 的表观类型是否具有该方法(在这种情况下,它检查接口 I 是否具有方法 m1() ),然后检查实际方法调用的实际类型(因此它调用 A 的 m1() 方法,因为 B 类没有它)。但是,为什么 java 编译器在 A 的 m1() 方法中调用 this.m2() 时不检查我的接口是否有 m2() 方法?该程序的输出如下:
A.m1
B.m2
A.m2
B.m3
解决方案
推荐阅读
- python - 手动计算多列的排名平均值
- javascript - ThreeJs不同的材料到立方体的每个面
- icons - Antd 仅在有子项时才展开图标表
- django - 如何在 Python 请求中实际使用 DRF + JWT 身份验证
- javascript - onMouseOver事件时如何停止图像重叠图像?
- android - 强制关闭后未调用Android广播接收器
- google-sheets - 如何修复 ARRAY_LITERAL 中的错误,数组文字缺少一行或多行的值
- azure - 具有部署槽的函数应用上的 ServiceBusTrigger
- python - 如何将从 Chrome 复制的 css 选择器路径转换为 beautifulsoup 对象?
- java - 如何将 Axon4 中的事件重播/投影到不同的上下文中?