博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java中,创建子类对象时,父类对象会也被一起创建么?
阅读量:4185 次
发布时间:2019-05-26

本文共 1014 字,大约阅读时间需要 3 分钟。

链接:https://www.zhihu.com/question/51920553/answer/128761716

java对象的内存布局是由对象所属的类确定。当一个类被加载到虚拟机中时,由这个类创建的对象的布局就已经确定下来了。

Hotspot中java对象的内存布局:每个java对象在内存中都由对象头和对象体组成。

对象头是存放对象的元信息,包括该对象所属类对象Class的引用以及hashcode和monitor的一些信息。

对象体主要存放的是java对象自身的实例域以及从父类继承过来的实例域,并且内部布局满足由下规则:

规则1:任何对象都是8个字节为粒度进行对齐的。
规则2:实例域按照如下优先级进行排列:长整型和双精度类型;整型和浮点型;字符和短整型;字节类型和布尔类型,最后是引用类型。这些实例域都按照各自的单位对齐。
规则3:不同类继承关系中的实例域不能混合排列。
首先按照规则2处理父类中的实例域,接着才是子类的实例域。
规则4:当父类中最后一个成员和子类第一个成员的间隔如果不够4个字节的话,就必须扩展到4个字节的基本单位。
规则5:如果子类第一个实例域是一个双精度或者长整型,并且父类并没有用完8个字节,JVM会破坏规则2,按照整形(int),短整型(short),字节型(byte),引用类型(reference)的顺序,向未填满的空间填充。

接下来说一下java对象的实例化方法,也就是常见的<init>方法。

当我们new一个对象时,其实jvm已经把这个对象的整个空间已经分配好,并且整个对象的实例域布局已经确定下来啦。
实例化方法<init>就是将对象实例域的值设置到相应空间中。

<init>方法以调用父类的<init>方法开始,以自身构造方法作为结束。实例域的声明与实例初始化语句块的位置关系会影响编译器生成的<init>方法的字节码顺序。还是以一个例子说明一下:

class Parent {    private short six;    private int age;}class Sub extend Parent{    private String name;    private int age;    private float price;}

当前Sub对象的内存布局由下:

super所谓的父类存储空间的表示到底是什么意思?这里的super存储就是绿色的那个位置

转载地址:http://kddoi.baihongyu.com/

你可能感兴趣的文章
DDR3基本概念8 - 如何理解RTT和VTT
查看>>
DDR3基本概念9 - 8n pre-fetch architecture的含义
查看>>
DDR3基本概念10 - DDR MT/S的理解
查看>>
git命令缩写配置
查看>>
makefile常见问题
查看>>
ncverilog编译时Unrecognized system task or function: $fsdbDumpfile问题的解决方法
查看>>
window10配置环境不起作用
查看>>
在官网下载maven历史版本
查看>>
tomcat之启动类BootStrap
查看>>
tomcat处理请求的流程
查看>>
Spring之lazy-init
查看>>
类的加载机制
查看>>
SpringIoc
查看>>
spring bean 的生命周期
查看>>
常用的排序算法
查看>>
浅谈web授权常用策略随机
查看>>
jenkins自动部署随记
查看>>
Shell命令的随记
查看>>
TCP,HTTP,WEBSOCKET随记
查看>>
关于JVM内存区域的组成以及堆内存的回收原理
查看>>