开发者社区> 问答> 正文

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

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

展开
收起
蛮大人123 2016-02-27 19:32:45 2228 0
1 条回答
写回答
取消 提交回答
  • 我说我不帅他们就打我,还说我虚伪

    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的信息.

    2019-07-17 18:49:18
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载