实现和继承在JVM内存中的一些情况

讲到实现和继承在内存中的区别,首先我们讲讲语法上他们的区别:

Java只允许单继承却能实现多接口。

对于单继承,试想一下,如果有两个父类ParentA和ParentB、一个子类ChildC,如果ChildC想super.两个父类的一个同样的方法F即super.F(),请问是调用了ParentA中的F还是ParentB中的F,明显就很难分清。

对于多实现,会在实现类里具体定义方法体,你可以说他是实现了ParentA的F,也可以说是实现了ParentB的F,因为实际运行的都是ChildC中具体F()实现的过程,不存在上面那种分不清的情况。

那对于JVM就内存的加载和调用来说,A是接口,B是具体实现类:

A a =new B();

在堆中创建一个B实例对象内存空间,在栈中创建一个引用变量a,a的地址指向B的内存空间。

a.print();

用A中的方法去调用B中的同名方法,这当然是正确的,因为B类实现了A接口。

B的实例方法存在一个专门的区叫方法区,B中所有的方法在创建B实例的时候B类的class方法二进制字节码就已经加载到了方法区,所有此类的方法调用的类对象均可以共享此代码空间,常量池会存放在堆里,当调用B中的方法的时候,先从方法区通过方法表快速拿到调用方法的字节码指令入栈并创建栈帧。对于a.print(),实际上在创建B对象的堆空间的时候,声明在栈里的a引用指向了B对象的内存空间首地址,所以在调用print方法的时候会去这个对象空间找对应的方法字节码,所以最终执行的是B中的print方法。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、快捷键 ctr+b 执行ctr+/ 单行注释ctr+c ...
    o_8319阅读 11,103评论 2 16
  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 14,736评论 0 38
  • 全国著名家庭教育专家薛立新教授:教育孩子慎重交友 孩子愿意交朋友,这无可厚非,但要看结交什么样的朋友。生活的丰富多...
    薛立新阅读 3,369评论 0 0
  • 今天向一位高僧求教: 拜佛。。。有信仰的话,拜下去感觉不一样,有点像婴儿投入母亲怀抱的感觉,自然很舒畅 我是直到信...
    bookaa阅读 2,515评论 0 1
  • 古人的话真有道理,古人云:姜是老的辣。 那女人拔腿就跑,旁边三两个看热闹的也迅速后撤。我这锤子还没举稳,你狼哭鬼叫...
    Im艾米阅读 1,241评论 0 0