gpt4 book ai didi

java - Java支持动态方法调用吗?

转载 作者:搜寻专家 更新时间:2023-11-01 04:05:17 27 4
gpt4 key购买 nike

class A           { void F() { System.out.println("a"); }}
class B extends A { void F() { System.out.println("b"); }}

public class X {
public static void main(String[] args) {
A objA = new B();
objA.F();
}
}

在这里,F() 是动态调用的,不是吗?

This article说:

... the Java bytecode doesn’t support dynamic method invocation. There are three supported invocations modes : invokestatic, invokespecial, invokeinterface or invokevirtual. These modes allows to call methods with known signature. We talk of strongly typed language. This allows to to make some checks directly at compile time.

On the other side, the dynamic languages use dynamic types. So we can call a method unknown at the compile time, but that’s completely impossible with the Java bytecode.

我错过了什么?

最佳答案

你混淆了动态调用动态绑定(bind)..

第一个允许类型检查器接受您不确定某个方法是否会在运行时出现在对象上的程序,而动态绑定(bind)只是根据对象的运行时类型选择正确的实现 < strong>但保持静态类型检查。

这是什么意思?

这意味着在您的示例中,Java 将调用对象B 上的实现,因为objA 变量的运行时类型是B;它会编译因为它知道 B 是一个 A 所以方法调用不会在运行时失败 (objA 肯定会有一个 F 实现。

相反,使用动态调用它不会在编译时检查您调用 F 的对象的类型是否包含该方法,当然如果在执行该方法时它会引发异常在指定对象上不可用。

仅供引用:invokedynamic 特性将随 Java7 添加,因为许多脚本语言已被编写为在 JVM 之上工作,并且缺少动态调用特性迫使这些语言的开发人员不得不在脚本和关心使用反射的动态调用的真实 JVM 之间添加一个中间层。当然,这种方法会导致大量开销(想想 Grovvy 的 MetaClass),这就是 Sun 决定给他们帮助的原因..

关于java - Java支持动态方法调用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2609227/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com