java - 方法 "live?"在哪里

标签 java

如果每个对象都有不同的实例变量副本,那么方法“存在于何处?”

举个例子:

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/

相关文章:

java - 为什么在连接前两个对象后从多个对象创建字符串失败

java - Struts 2 - 升级后 Controller 映射错误

java - 一个不停运行的线程

java - java中的UTF编码

java - 使用 JLabel 作为打开弹出窗口的链接

java - Scala 在线程中对待 "sharing"局部变量的方式与 Java 不同?它是如何工作的?

java - 当对象类型可用时,为什么需要通配符?

矩阵乘法中的 java.lang.ArrayIndexOutOfBoundsException

java - 跟踪运行时拖动事件的进度。 JavaFX

java - SwingWorker 未正确运行 doInBackground