java向上转型时堆上发生了什么? -问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

java向上转型时堆上发生了什么?

蛮大人123 2016-02-27 19:32:45 1547

screenshot
如上面的两个类
定义
A a = new A();
Base b = (Base) a;
Base c = a;
当定义a时,内存中在栈上存储对A对象的引用a,在堆上生成A对象
当定义b时,内存中在栈上存储Base对象的引用,那么在堆上会是什么样的变化?
当定义c时,栈和堆上分别有什么生成?

存储 Java
分享到
取消 提交回答
全部回答(1)
  • 蛮大人123
    2019-07-17 18:49:18

    java里对象的内存分布并没有在标准里规定, 是和 具体jvm实现相关的. jvm spec 8, section 2.7
    对sun java来说, 你的代码, 在堆里只有一个对象, 就是class A. 具体在内存里, 应该有 java 对象头(指定此对象对应的class), 各个fields(包含其parent class的各个域), 还有padding. 有兴趣的话, 可以去玩一玩UnSafe, 看看java对象的内存分布. 随便找一个link然后你定义的三个引用, 其实都指向同一个A对象. 这些引用, 只在编译器有意义. 这么说吧, 比如Base和A 里都有f()函数, 然后你用这三个引用去调用f(), 最终调用的都是 A里的f(). 因为 上面说了, 此java对象, 在java对象头中包含了 它真正是哪个class的信息.

    0 0
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

推荐文章
相似问题
推荐课程