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求助.
首先,这是JVM依赖并且对在JLS或JVM规范没有规定如何,这些问题应该得到解决,只是说他们应该得到解决.
狗如何知道树皮方法在堆中的位置?
通常你有所谓的虚方法表,或简称v表.您可以将此视为表映射方法标识符(例如bark)到函数指针.也就是说,如果你调用barkVM,它将调查它的v-table并调用指向的方法bark.扩展类并重写方法时,只需交换方法指针以指向覆盖函数.
狗如何知道树皮方法在堆中的位置?知道狗类在哪里?
方法和类不以与实例相同的意义存储在堆上.他们为什么?
也许你和我开始使用OO编程时有同样的误解.我想如果我实例化10 Dog,我会得到10个树皮方法.这不是真的.实例化对象时"得到"的基本上是成员变量和this引用.然后,您可以将this引用视为在调用非静态方法时传递的额外参数.