持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情
类与对象的内存图
概述
在之前的开发中我们只是知其然,而不知其所以然,本章将告诉大家代码运行的内存图,这将使我们非常直观理解面向对象的程序执行过程。
内存中主要包括(我们java中常用的)
-
堆区:(Heap),此内存区域的目的就是存放对象实例(很多情况下,就是你new出来的的对象),几乎所有的对象实例都在这里分配内存。Java虚拟机中对此描述为:所有的对象实力以及数组都要在堆上分配
-
栈区:(Stack)是指虚拟机栈。虚拟机栈用于存储局部变量等。局部变量存放了编译期可知长度的各种基本数据类型(boolean、byte、char 、 short 、 int 、 float 、 long 、 double)、对象引用。 方法执行完,自动释放。
-
方法区 : 用于存储已被虚拟机加载的类、常量、静态变量、等数据。
一个对象内存图
我们使用前面的学生类来介绍对象的内存图
代码
/*
学生测试类
*/
public class StudentDemo {
public static void main(String[] args) {
//创建对象
Student s = new Student();
//使用对象
System.out.println(s.name + "," + s.age);
s.name = "张曼玉";
s.age = 28;
System.out.println(s.name + "," + s.age);
s.study();
s.doHomework();
}
}
内存图
成员变量使用过程
成员方法调用过程
4.3 两个对象内存图
代码
/*
学生测试类
*/
public class StudentDemo2 {
public static void main(String[] args) {
//创建对象
Student s1 = new Student();
s1.name = "林青霞";
s1.age = 30;
System.out.println(s1.name + "," + s1.age);
s1.study();
s1.doHomework();
Student s2 = new Student();
s2.name = "张曼玉";
s2.age = 28;
System.out.println(s2.name + "," + s2.age);
s2.study();
s2.doHomework();
}
}
内存图
成员变量使用过程
成员方法调用过程
总结:
多个对象在堆内存中,都有不同的内存划分,成员变量存储在各自的内存区域中,成员方法多个对象共用的一份
多个对象指向相同内存图
代码
/*
学生测试类
*/
public class StudentDemo3 {
public static void main(String[] args) {
//创建对象
Student s1 = new Student();
s1.name = "林青霞";
s1.age = 30;
System.out.println(s1.name + "," + s1.age);
Student s2 = s1;
s2.name = "张曼玉";
s2.age = 28;
System.out.println(s.name + "," + s.age);
System.out.println(s2.name + "," + s2.age);
}
}
内存图
总结
当多个对象的引用指向同一个内存空间(变量所记录的地址值是一样的)
只要有任何一个对象修改了内存中的数据,随后,无论使用哪一个对象进行数据获取,都是修改后的数据。