如何在java中实现多态?

时间:2012-08-18 19:17:33

标签: java oop polymorphism

在Java中,所有公共非静态方法都是虚拟的。这意味着要调用哪个方法是在运行时决定的(动态绑定)。 在C ++中,虚函数(动态绑定)是使用vpointer和vtable实现的。我想知道Java是如何实现的。 Java是否也使用vpointer和vtable(如C ++)或其他一些技术来了解在运行时调用哪种方法?

4 个答案:

答案 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