java - Java 重载和重写的方法
问题描述
在下面的程序中,我在类 A 中的一个方法重载了 3 次,然后在子类 B 中,所有 3 个重载方法都被覆盖。
obj3 是一个具有引用类型 A(超类)和对象类型 B(子类)的对象,它在执行时从 B 调用方法,这是预期的行为。
由于此代码中都存在重载和覆盖,这是否意味着它在编译时执行静态绑定(到 A 类中的匹配方法),然后在运行时执行动态绑定(到 B 类中的方法)。它们可以同时发生吗?
我的假设是,这是动态绑定的经典案例,因为我认为“绑定”是一种永久性操作,但同行建议它是一起的(首先是静态的,然后是动态的)。
class A{
public void method(Integer n){
System.out.println("Integer: "+n);
}
public void method(String s){
System.out.println("String: "+s);
}
public void method(String s, Integer n){
System.out.println("String: "+s+" Integer: "+n);
}
}
class B extends A{
public void method(Integer n){
System.out.println("Integer(from B): "+n);
}
public void method(String s){
System.out.println("String(from B): "+s);
}
public void method(String s, Integer n){
System.out.println("String(from B): "+s+" Integer(from B): "+n);
}
}
public class Test{
public static void main(String[] args){
A obj1 = new A();
B obj2 = new B();
A obj3 = new B();
System.out.println("Integer form of method");
// Integer form of method
System.out.println("Ref A Obj A");
// Ref A Obj A
obj1.method(1);
// Integer: 1
System.out.println("Ref B Obj B");
// Ref B Obj B
obj2.method(2);
// Integer(from B): 2
System.out.println("Ref A Obj B");
// Ref A Obj B
obj3.method(3);
// Integer(from B): 3
}
}
解决方案
你说得对。编译器在类中的重载之间进行静态选择A
,并将该信息.class
以方法 FQN 的形式放入文件中。
然后运行时在该方法的实现之间动态选择。
推荐阅读
- docker - Docker容器无法挂载文件夹
- python - 如何在多个java文件中搜索某个语句?
- javascript - 如何修复此正则表达式以使其正确替换 *(在单词之间)?
- html - 我该怎么做才能使我的代码在 2 个不同的屏幕上看起来不错
- docker - 如何在 Jenkins 脚本化管道中使用 dockerhub-notification-plugin?
- php - 有没有办法在 MySQL 更新查询中使用变量
- javascript - 如何从 JQuery AJAX 生成的 HTML 数据中获取属性 id?JavaScript
- node.js - 如何通过 REST API 从 IONIC typescript 读取 node.js app.js 中的数据?
- go - 调用结构上的方法时,Goroutines 不起作用
- makefile - 由于安装 ROS 时 CPU 使用率达到 100,Raspberry Pi 冻结