Java面向对象内存分析详解(实例、图)通俗易懂

Java面向对象内存分析详解(实例)通俗易懂

在开始之前先了解一下【JAVA虚拟机运行时数据区域

1. 一个对象的内存图解

在这里插入图片描述
①、在运行main方法之前,方法区最先有数据,按照上述代码执行顺序,把类相关信息加载到方法区中
②、main方法开始进栈(也叫做压栈),执行 Phone one=new Phone(),把Phone one存到栈中(局部变量/引用),把new Phone()存到堆中(new 的对象/数组),那么new出来的对象内容去哪里找呢?
③、在我们创建对象的时候,我们从方法区找到成员变量、成员方法存放到堆中,然后我们在中把三个成员变量赋上初始值null、0.0、null,在中我们把成员方法赋个地址值为【0x333】(成员方法其实保存的是一个地址值),这时堆当中的成员方法是一个地址值指向了方法区。我们把new Phone()也赋个地址值为【0x666】。
④、那么我们在栈中就可以把【one】赋个地址值为【0x666】,我们在继续看代码,执行三行打印输出语句,根据地址【0x666】就可以找到这个对象,之前在堆中赋上了初始值null、0.0、null,所以打印出来的就是null、0.0、null,接下来在执行【one.brand=“苹果”】、【one.price=8388.0】、【one.color=“黑色”】,根据地址值在堆中重新赋值为【苹果】、【8388.0】、【黑色】改变了成员变量的值。
⑤、执行【one.call()】方法,首先通过one的地址值【0x666】在堆中找到成员方法,在通过成员方法的地址值【0x333】在方法区找到call()方法,call()方法要是运行,【call(String who)】方法就要进栈(也称压栈:先进后出),然后打印一句话,运行完后,call方法就会出栈,从内存中释放。main方法还没运行完,接下来在运行sendMessage()方法,同理运行完出栈,最后main方法运行完也要出栈,整个程序运行结束。

下面几种情况,结合代码和图可以自己试着分析。道理都大同小异。

2. 两个对象使用同一个方法的内存图解

在这里插入图片描述

3. 两个引用指向同一个对象的内存图解

在这里插入图片描述

4. 使用对象类型作为方法的参数内存图解

在这里插入图片描述

5. 使用对象类型作为方法的返回值类型内存图解

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我的名字是雪冬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值