JVM如何选择执行哪种方法?
选择过程分为两部分是否属实?首先,编译JVM时会查找要执行的候选方法.它在声明的对象类中选择所需的签名(不是有效的签名).一旦选择了候选签名,它就会从对象的有效类开始在层次结构中查找它.
它是否正确?
还有一个问题:
这是一个类层次结构和相关方法:
- Class A: +f(short x): int; +f(String x): int;
- Class B extends A: +f(int x): int; +f(String x): int;
- Class C extends A: +f(double x): int; +f(byte x): int;
- Class D extends C: +f(byte x): int; +f(short x): int;
- Class E extends C: +f(char x): int; +f(int x): int;
Run Code Online (Sandbox Code Playgroud)
所以:
所有这些类只有一个名为"f"的方法,其中包含所提到的签名.
我现在声明以下对象:
A a = new D();
B b = new B();
C c = new E();
Run Code Online (Sandbox Code Playgroud)
1.为什么方法调用af(3)无法处理并返回错误?
如果我之前提到的是正确的,那么应该发生什么:
对于具有签名f(int x)或任何兼容签名(使用强制转换)的方法,JVM查看A类.它找到了应该兼容的方法f(短x),对吗?然后它在D类中查找这个非常精确的签名,并发现它执行D:f(短x).根据我的书,这是不正确的,为什么?这可能是因为short实际上并不是int的提升,因此JVM不考虑适合呼叫的f(短x)?因此不会发现任何f方法兼容并将返回错误.
我检查了谷歌和我能找到的任何其他资源(也在Stackoverflow上),但都非常明显,没有足够详细的答案,因此我认为这可能是一件好事,我希望它会转变我们的答案将是对于未来的学生超载和覆盖战斗有用:)提前谢谢.
唯一可以调用的两个方法是:
A类:+f(short x): int; +f(String x): int;
为了使转换有效,我们需要将整数 3 隐式转换为短整型或字符串。
但是您不能将整数 3 隐式转换为较小的 Short。当然,它不能隐式转换为字符串,因此无法对其进行处理。
编辑:
因为您将类 D 的实例放入 A 容器中,所以实例 a 只知道 A 的方法。您必须将 a 的实例强制转换为 D 才能调用 D 的方法,然后您可以将 int 3 隐式强制转换为 double 并调用该f(double)方法。