栈(stack) 堆(heap) 方法区(Method Area)当一个对象调用了成员变量、成员方法、java内存中发生了什么?

1.栈(Stack):存放的都是方法中的局部变量 。方法的运行一定要在栈当中。
局部变量:方法的参数,或者是方法{}内部的变量
作用域:一旦超出作用域(也就是{}),立刻从栈内存当中消失。
2.堆(Heap):凡是new出来的东西,都在堆当中。
堆内存里的东西都有一个地址值:16进制
堆内存里的数据,都有默认值。规则:
如果是整数 默认为0
如果是 浮点数默认为0.0
如果是字符 默认 ‘\u0000’
如果是布尔 默认为false
如果是引用类型 默认为null
3.方法区(Method Area):储存.class相关的信息,包含方法的信息
4.本地方法栈(Native Method stack)与操作系统相关。
5寄存器(pc Register):与CPU相关

下面我为大家举一个例子在这里插入图片描述
main 方法是程序的入口, 在方法区里面通过mian(String[] args)进入到栈中,因为方法都是在栈中运行,堆中存的是new 出来的东西,所以开辟了一块内存空间并生成一个地址,里面存了成员变量和成员方法,并为成员变量赋值默认值。但是堆是怎么知道的 new Phone();里面存了什么东西呢?这时候堆会通过方法区找到 Phone.class,看里面有什么东西,堆一看Phone.class发现它里面存的有成员变量和成员方法,把它们拿过来。堆中的成员方法存的是地址值方法区里面的成员方法是同一个的地址
当phone对象调用成员变量时,会根据对象储存的地址在堆中找相同的地址并为它们赋值。当phone对象调用成员方法时,找到堆中成员方法的地址值,堆根据地址值在方法区里面找相同的地址值并调用这个方法,然后成员方法进栈 也称为压栈,当成员方法执行结束后,就会立刻消失*。****

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值