在Java中,所有公共非静态方法都是虚拟的。这意味着要调用哪个方法是在运行时决定的(动态绑定)。 在C ++中,虚函数(动态绑定)是使用vpointer和vtable实现的。我想知道Java是如何实现的。 Java是否也使用vpointer和vtable(如C ++)或其他一些技术来了解在运行时调用哪种方法?
答案 0 :(得分:5)
vtable,如https://wikis.oracle.com/display/HotSpotInternals/VirtualCalls
所述[编辑Tomasz在问题评论中提出了一个很好的观点 - 这是针对Oracle的热点]
答案 1 :(得分:0)
由于这是Java虚拟机的世界,故事并不那么简单。你能做的最好的事情就是了解所有各种特殊情况下使用的所有技巧。这不是一个糟糕的起点:Inline caching。
答案 2 :(得分:0)
基本上,它是使用虚拟功能表(概念性地)实现的,并为其编制索引。但是有许多曲折,特别是“invokespecial”调用和接口调用,需要额外/不同的处理。
实际上,许多数据都是缓存的,以提高通话效率。
答案 3 :(得分:0)
并非所有非静态方法都在运行时绑定。在可能的情况下,可以在编译时确定需要调用哪个版本的方法。特别是,当编译器可以100%确定地确定需要调用哪个方法。一个这样容易的情况:
public class Foo {
public final void foo() { ... }
public void bar() { ... }
public void bar(String s) { ... }
}
Foo foo = new Foo();
// All three of these could would be bound at compile time.
foo.foo();
foo.bar();
foo.bar("baz");
还有一些基于重载的情况,可以确定编译时绑定。 我不是100%确定所有不同的情况,但也有一些。
这是一篇关于这个主题的好文章:
http://www.dzone.com/links/r/difference_between_static_and_dynamic_binding_in.html