如果每个对象都有不同的实例变量副本,那么方法“存在于何处?”
举个例子:
class A {
public foo() {
System.out.println("foo");
}
}
class B extends A {
public foo() {
System.out.println("foofoo");
}
}
public class Main {
public static void main(String[] args) {
A a = new B();
a.foo(); // "foofoo"
}
}
我知道打印了“foofoo”。那么方法是绑定(bind)到对象还是什么的?
最佳答案
您所指的过程称为动态调度。这通常是通过虚拟表(通常称为 vtables)实现的:
http://en.wikipedia.org/wiki/Virtual_table
关于 vtables 工作原理的一个简单总结是,每个方法都存储在某个内存地址,而 vtable 存储这些地址。使用您的示例,A
有一个 vtable,其中包含一个条目,该条目包含其版本的 foo
的内存地址,而子类 B
有自己的vtable 具有相同的布局,但它持有自己的 foo
的内存地址。
关于java - 方法 "live?"在哪里,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3860778/