对象内存图(多个对象)

1.多个对象

1. 首先,main()方法被加载到栈内存。(图1)

图 1

2.创建第一个对象。在mian方法中出现 s1;new Student() 就会在堆内存中出现,name 和 age 对应的默认值分别为 null 和 0;它的地址值是001,赋值给 s1,s1 通过 001 就指向堆内存这块地址。(图2)

图 2

3.   s1.name = "林青霞";
这里修改了 s1 对应的name值为:林青霞
同理, s1.age = 30;  把age 对应的值修改为30       (图 3)

图 3

4. 第一次输出的时候。
s1 通过 栈内存的 001 指向 堆内存的 001.
name 和 age 的值分别是:林青霞 和 30
做一个拼接,在控制台输出    (图 4)

图 4

5. 调用方法  s1.Study();
Study方法 加载到栈内存中,方法调用者:s1(地址值是 001);方法开始执行,在控制台输出:好好学习;接着往下,方法执行结束,从栈内存中消失  (图 5)
同理,s1 调 doHomework 方法也是如此

图 5

6. 创建第二个对象并使用
Student s2 = new Student();   首先在main 方法里 会出现一个 Student s2 ;new Student() 在堆内存中出现,name 和 age 对应的默认值分别为 null 和 0;地址值 002 ,把002 赋值给了 s2,通过002 指向堆内存的这块 内存空间     (图 6)

图 6

(s1、s2 对应的地址值是不相同的,两个对象分别对应 堆内存里 001、002 地址内容)   (图 7)

图 7

7. s2.name = "张曼玉";
s2 通过 002指向了堆内存的 002,修改 name值为 张曼玉   (图 8)
同理,age 值 修改为 28  (图 9)

图 8
图 9

8. 第二次输出
s2 通过 栈内存的 002 指向 堆内存的 002
name 和 age 的值分别是:张曼玉 和 28
做一个拼接,在控制台输出   (图 10)

图 10

9.    s2.study();
还是这个类 它的study方法加载到栈内存,这次,调用者 s2 (002)方法开始执行,在控制台输出:好好学习;接着往下,方法执行结束,从栈内存中消失   (图 11)

图 11

同理,s2 调 doHomework 方法也是如此
10. 再往下,main方法执行结束 ,从栈内存消失

s1 和 s2 它们成员变量 值不同,但是它们调用成员方法在控制台输出是一样的,方法多个对象是可以共用的,而每个成员变量的值是由有不同的。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容