java继承的内存图

关于继承的内存图我们可以通过具体代码讲解:

首先测试类的main()方法和class文件加载到方法区,main()方法被虚拟机调用入栈,执行main方法中第一句代码,将类Zi的字节码文件和变量加载到方法区,有类Zi继承了Fu类,所有Zi类会把Fu类的class文件和变量加载至方法区,同时Fu类继承object类,所以object的class文件也会被加载。如下图所示:

接着执行等号左边,Zi z加载入栈,等号右边在堆内存中开辟一个空间,与之前不同的是,该空间被一分为二,一边加载父类的成员变量,一边则是自己的成员变量。对于生成的变量各自赋上初始化值。并将地址赋值给栈中的变量。

接下来,sout(z)则输出的是地址值001,对于z.age=23以及后两句,将23赋值给Z的name,Z地址为001,通过001找到Z 的地址,该地址分为两块,先在右边子类找成员变量age,若没有在父类一侧找成员变量。

最后main出栈,此时无指向堆内存的变量,堆内存被清理回收!

对于包含私有成员变量的情况

对于包含私有成员变量的情况内存图大部分与非私有的相同,但是在一些地方存在差异。差异在sout(z);之后,在此行代码之前,内存原理与上述情况一样,现分析之后的代码。

z.name="钢门吹雪";z.age=25;执行这两行代码时,同样通过001找到Z 的地址,该地址分为两块,先在右边子类找成员变量age,若没有在父类一侧找成员变量。但是此时name和age为父类的私有成员变量因此在堆内存中不能找到该变量,所以系统会报错。

除此之外,皆与非私有一样。

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值