【java面向对象】内存分析

情景导入

今天小编来说说一个对象的基本初始化过程。下面这个小demo有Student和StudentTest两个类。
Student类:
成员变量:name,age
成员方法:study,eat
【java面向对象】内存分析
StudentTest类中:
(1)创建对象——输出成员变量的值,这里输出的是默认值
(2)给成员变量赋值——再次输出成员变量的值,输出的是赋值后的
(3)最后调用了方法

【java面向对象】内存分析
执行结果:
【java面向对象】内存分析

准备工作

在内存中有3个区:栈、堆、方法区。
方法区中分为两部分,一部分是StudentTest;一部分是Student,有成员变量、成员方法,其中成员方法有个地址:001
【java面向对象】内存分析
程序执行,将main()方法加载到栈,开辟一个空间
【java面向对象】内存分析

执行Student s=new Student();

在此空间中,出现Student s
【java面向对象】内存分析
在堆内存中执行new Student()
【java面向对象】内存分析
在堆内存中开辟一个空间,里面的数据参照Student,特殊的是成员方法中存的是方法区中的地址。最后自身再生成一个地址,002,并把它赋值给p
【java面向对象】内存分析

输出成员变量

输出成员变量时,s通过002找到堆中相对应的区域。

调用 结果
s.name 名字:null
s.age 年龄:0
给成员变量赋值

【java面向对象】内存分析
再次输出:

调用 结果
s.name 名字:小明
s.age 年龄:15
调用成员方法

调方法中,s通过002找到堆中的001,然后再找到方法区中的study(),将其加载到栈内存,开辟空间。执行study()方法,将“小红”传到Student中,然后输出“向小红学习”。
【java面向对象】内存分析
方法被调用完毕后,就会被清除。
【java面向对象】内存分析
eat()方法也是如此。
【java面向对象】内存分析
方法执行完毕后,mian()也就执行完毕了,也在内存中消失。
【java面向对象】内存分析