Dynamic method dispatching in Java(Java中的动态方法调度)
问题描述
以下是关于我的疑问的代码片段.
The following is the code snipplet regarding my doubt.
class A {
void someMethod(A param) {
System.out.println("A");
}
}
class C extends A {
void someMethod(C param) {
System.out.println("C");
}
}
class DMD {
public static void main(String[] args) {
A ac = new C();
C c = new C();
ac.someMethod(c);
}
}
输出:
A
但我将输出排除为
C
因为我已经为 C
分配了内存,而 A
指的是 C
的内存位置,所以如果我调用该方法指向 C
的 A
引用,并且参数作为 C
类型传递,那么我期望 someMethod(C)
方法应该执行.
Because I have allocated memory for C
, and A
is referring to C
's memory location, so if I call the method on the A
reference which is pointing to C
, and the argument is passed as C
type, then I expect the someMethod(C)
method should execute.
谁能给我这种行为的正当理由?
Can anyone please give me the proper reason for this behaviour?
提前致谢.
推荐答案
在编译时实现对采用不同参数类型(重载)的方法的方法调用.(这是你的情况)
Method invocations on methods taking distinct argument types (overloading) are realized at compile time. (And this is your case)
如果所有 3 个方法都接受类型 A 的参数 - 即方法 覆盖 存在,那么只有多态性才会发挥作用并触发 C
的方法,前提是存在A 和 C 之间的继承关系,即 C 扩展 A.
If all 3 methods accepted argument of type A - i.e. method overriding was present, only then polymorphism would come into play and would trigger the method of C
provided there is a inheritance relationship between A and C i.e. C extends A.
这篇关于Java中的动态方法调度的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:Java中的动态方法调度
基础教程推荐
- Java 中保存最后 N 个元素的大小受限队列 2022-01-01
- 由于对所需库 rt.jar 的限制,对类的访问限制? 2022-01-01
- 如何使用 Eclipse 检查调试符号状态? 2022-01-01
- 在螺旋中写一个字符串 2022-01-01
- 如何强制对超级方法进行多态调用? 2022-01-01
- 首次使用 Hadoop,MapReduce Job 不运行 Reduce Phase 2022-01-01
- 如何对 HashSet 进行排序? 2022-01-01
- 如何在不安装整个 WTP 包的情况下将 Tomcat 8 添加到 Eclipse Kepler 2022-01-01
- Spring Boot Freemarker从2.2.0升级失败 2022-01-01
- 如何使用 Stream 在集合中拆分奇数和偶数以及两者的总和 2022-01-01