JVM如何进行方法查找和调用?

时间:2014-09-29 17:49:09

标签: java jvm

该方法在哪里?例如,

class Foo {
  public void foo_test(){}
}

Foo f1 = new Foo();
f1.foo_test();

(new Foo() {
  public void singleton_test(){
    foo_test();
  }
}).singleton_test();

方法是否驻留在类或实例中?

JVM是否进行方法查找(如C ++ vtable)?如何进行上述两种方法调用?

我正在看这个页面:

http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-5.html

但它只是简要解释了查找程序,而不是地点或任何细节。


这个问题与Oracle JVM特别相关。

1 个答案:

答案 0 :(得分:1)

Java中的所有方法都是虚拟的,但标记为static的方法除外。您的第二个示例只是创建一个匿名内部类,其行为几乎与命名类完全相同。 (从这个角度来看,它的行为完全相同。)

未指定方法查找的确切机制,这取决于VM实现。这也为智能优化提供了空间,例如,如果方法没有覆盖另一个方法并标记为final,则可以确定不需要额外的间接。