java 类与内存

109 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情

类与对象的内存图

概述

在之前的开发中我们只是知其然,而不知其所以然,本章将告诉大家代码运行的内存图,这将使我们非常直观理解面向对象的程序执行过程。
内存中主要包括(我们java中常用的)

  1. 堆区:(Heap),此内存区域的目的就是存放对象实例(很多情况下,就是你new出来的的对象),几乎所有的对象实例都在这里分配内存。Java虚拟机中对此描述为:所有的对象实力以及数组都要在堆上分配

  2. 栈区:(Stack)是指虚拟机栈。虚拟机栈用于存储局部变量等。局部变量存放了编译期可知长度的各种基本数据类型(boolean、byte、char 、 short 、 int 、 float 、 long 、 double)、对象引用。 方法执行完,自动释放。

  3. 方法区 : 用于存储已被虚拟机加载的类、常量、静态变量、等数据。

一个对象内存图

我们使用前面的学生类来介绍对象的内存图

代码

/*
    学生测试类
 */
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();
    }
}

内存图

成员变量使用过程

1.png

成员方法调用过程

2.png

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();
    }
}

内存图

成员变量使用过程

3.png

成员方法调用过程

4.png

总结:

多个对象在堆内存中,都有不同的内存划分,成员变量存储在各自的内存区域中,成员方法多个对象共用的一份

多个对象指向相同内存图

代码

/*
    学生测试类
 */
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);
    }
}

内存图

4.bmp

总结

当多个对象的引用指向同一个内存空间(变量所记录的地址值是一样的)

只要有任何一个对象修改了内存中的数据,随后,无论使用哪一个对象进行数据获取,都是修改后的数据。