就以这段代码我们通过画图进行模拟内存的运行过程吧

首先第一步,我们先加载类信息,类信息是在方法区里边执行的,而每一个类信息都有字符串常量池,静态属性和方法区,至于为什么还有方法的代码就是因为每次创建一个对象如果对复制一份study()代码,kickball()代码,Student()代码这样子就过于浪费空间了:

第二步,执行main(),只要执行方法都会在栈里边创建栈帧,并且遵循栈的
"先进后出,后进先出"的原则

第三步创建对象,创建对象又可以分成四步
1、在堆中创建对象然后并将对象成员变量默认赋0或空值

2、执行属性的初始化,就是看在类中创建属性的时候是否有赋初值,如果有的话在这一步进行,而我们没有,就直接跳过
3、运行构造方法而只要执行方法都要在栈中创建栈帧,而每一个方法在创建的时候都会有一个隐式参数this:地址,谁调用的这个方法那么this就等于它的地址,我这里是0x11在创建对象时自动运行构造方法,所以0x11的隐式参数this = 0x11

然后当这个方法执行完后会将这个方法释放

4、返回这个对象的地址给变量

执行完后开始往下执行,s.id = 1 等于 0x11.id = 1,s.age = 16 等于 0x11.age = 16,
s.name = "咸蛋侠" 等于 0x11.name = "咸蛋侠",但是字符串都放在了字符串常量池中,所以name指向字符串常量池中的"咸蛋侠"

然后就是以此类推,创建study()栈帧,kickball()栈帧
本文通过代码示例解析了Java内存的运行过程,包括类信息加载、栈帧创建、对象的四步创建以及内存中的数据存储。重点讨论了方法区、栈和堆的作用,以及对象创建时的初始化和构造方法执行。同时提到了字符串常量池和栈的先进后出,后进先出原则。
773

被折叠的 条评论
为什么被折叠?



