继承技术如何运作?

SCB*_*Boy 5 java heap storage class object

我即将在我的公司(我是一名实习生)中介绍Java中的继承.我想我已经明白了,我也知道如何使用它.但有一点不太确定.存储在存储器中的方法在哪里.对象如何知道方法的位置?

例如:

我们有这门课.

class Animal {
    private String desc1;
    protected String desc2;

    public void breath() {
    }

    public void eat() {
    }
}
Run Code Online (Sandbox Code Playgroud)

而这堂课:

  class Dog extends Animal() {
        public void bark() {
        }
    }
Run Code Online (Sandbox Code Playgroud)

我们现在创建一个Dog类的对象:

狗狗=新狗();

所以现在我的问题是: 类被加载到堆中.所以狗和动物都在堆里. (编辑:多数民众赞成错了,类没有加载到堆中,看下面的答案.). 所以,让我们说dog.bark().狗如何知道树皮方法在堆中的位置?知道狗类在哪里?接下来我们制作dog.eat(): 当狗知道狗在哪里时,狗知道动物在哪里或狗是否知道动物在哪里?知道我的意思是它有一个地址在堆上.当我覆盖一个方法时怎么样?存储在哪里?

thx求助.

aio*_*obe 8

首先,这是JVM依赖并且对在JLS或JVM规范没有规定如何,这些问题应该得到解决,只是他们应该得到解决.

狗如何知道树皮方法在堆中的位置?

通常你有所谓的虚方法表,或简称v表.您可以将此视为表映射方法标识符(例如bark)到函数指针.也就是说,如果你调用barkVM,它将调查它的v-table并调用指向的方法bark.扩展类并重写方法时,只需交换方法指针以指向覆盖函数.

狗如何知道树皮方法在堆中的位置?知道狗类在哪里?

方法和类不以与实例相同的意义存储在堆上.他们为什么?

也许你和我开始使用OO编程时有同样的误解.我想如果我实例化10 Dog,我会得到10个树皮方法.这不是真的.实例化对象时"得到"的基本上是成员变量和this引用.然后,您可以将this引用视为在调用非静态方法时传递的额外参数.