【java面向对象】内存分析
情景导入 |
今天小编来说说一个对象的基本初始化过程。下面这个小demo有Student和StudentTest两个类。
Student类:
成员变量:name,age
成员方法:study,eat
StudentTest类中:
(1)创建对象——输出成员变量的值,这里输出的是默认值
(2)给成员变量赋值——再次输出成员变量的值,输出的是赋值后的
(3)最后调用了方法
执行结果:
准备工作 |
在内存中有3个区:栈、堆、方法区。
方法区中分为两部分,一部分是StudentTest;一部分是Student,有成员变量、成员方法,其中成员方法有个地址:001
程序执行,将main()方法加载到栈,开辟一个空间
执行Student s=new Student(); |
在此空间中,出现Student s
在堆内存中执行new Student()
在堆内存中开辟一个空间,里面的数据参照Student,特殊的是成员方法中存的是方法区中的地址。最后自身再生成一个地址,002,并把它赋值给p
输出成员变量 |
输出成员变量时,s通过002找到堆中相对应的区域。
调用 | 结果 |
---|---|
s.name | 名字:null |
s.age | 年龄:0 |
给成员变量赋值 |
再次输出:
调用 | 结果 |
---|---|
s.name | 名字:小明 |
s.age | 年龄:15 |
调用成员方法 |
调方法中,s通过002找到堆中的001,然后再找到方法区中的study(),将其加载到栈内存,开辟空间。执行study()方法,将“小红”传到Student中,然后输出“向小红学习”。
方法被调用完毕后,就会被清除。
eat()方法也是如此。
方法执行完毕后,mian()也就执行完毕了,也在内存中消失。