java - 多态实例如何选择它的方法?
问题描述
我无法理解这段代码的行为。a 定义为 A,c 定义为 C。然后,在公共类的末尾,a = c。当 a 调用 display() 方法时,它会到达它的 C 版本。但是,当 a 调用 f() 时,它只能到达 A 版本,尽管第一个参数(字节和 long)比 float 更符合 long。
这是一本书的练习,但解释很少,或者根本不存在。
class A{
public void display(){
System.out.println("I am an A ");
}
public void f(double x){
System.out.println("A.f(double = " + x + ") ");
}
}
class C extends A{
public void display(){
System.out.println("I am a C ");}
public void f(long q){
System.out.println("C.f(long = " + q + ") ");}
}
public class PolySurStack{
public static void main(String Args[]){
byte bb =1; long q = 4; float x = 5.f;
System.out.println(" ** A **");
A a = new A(); a.display();
a.f(bb); a.f(x);
System.out.println();
System.out.println(" ** C **");
C c = new C(); c.display();
c.f(bb); c.f(q); c.f(x);
System.out.println();
a = c; a.display();
a.f(bb); a.f(q); a.f(x);
}
}
解决方案
我刚刚在另一个论坛上发现了这个:
重载:(相同的函数名称但不同的签名)
在同一类中具有相同名称但参数不同的两个或多个方法称为重载。
当您想要扩展功能时使用重载。
重载被称为编译时多态性
覆盖:(相同的函数名称但相同的签名)
在父类和子类中具有相同方法名称和相同参数的两个或多个方法称为覆盖。
当您想要重用现有功能时,使用覆盖。
覆盖被称为运行时多态性
所以我的问题的答案似乎是覆盖分辨率(如 display() )发生在运行时(在 a = c 之后),而重载分辨率(如 f() )发生在编译时,此时 a 仍然是一个。
我认为。
我还找到了这个页面:https ://beginnersbook.com/2013/04/runtime-compile-time-polymorphism/
清楚并与该主题高度相关。
推荐阅读
- firebase-cloud-messaging - IndexedDB firebase-messaging-store 中的这个“令牌”有什么意义
- c - 如何使用 Nucleo-F303K8 每 1us 进行一次 adc 转换?
- google-sheets - 区分一列中的两个变量
- python - 使用 BeautifulSoup 从 Python 中的 HTML 中提取未列出的元素
- docker - Docker 编写环境变量
- javascript - 如何从页面中检索“gtag”(谷歌标签)?
- javascript - Vue + Typescript - 使用基于类的装饰器导入错误
- sql - 顶行上的 SQL 特定项
- json - JSON_VALUE 路径“$”包含数据时返回 NULL
- html - 如何使 CSS 网格行堆栈内的列相互叠加?