该方法在哪里?例如,
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特别相关。
答案 0 :(得分:1)
Java中的所有方法都是虚拟的,但标记为static
的方法除外。您的第二个示例只是创建一个匿名内部类,其行为几乎与命名类完全相同。 (从这个角度来看,它的行为完全相同。)
未指定方法查找的确切机制,这取决于VM实现。这也为智能优化提供了空间,例如,如果方法没有覆盖另一个方法并标记为final
,则可以确定不需要额外的间接。