理解堆和栈的概念

93 阅读1分钟

假设有这么一个程序:

public class StackAndHeapExample {
    public static void main(String[] args) {
        int i = 1; // i 存储在栈中
        String s = "Hello, World!"; // s 存储在栈中,"Hello, World!" 存储在堆中
        Object obj = new Object(); // obj 存储在栈中,new Object() 存储在堆中
    }
}

在上面的程序中,我们定义了三个变量'i'、's'、'obj',它们都存储在栈中。其中,'i'是一个基本数据类型的变量,存储在栈中的是'i'的值。而 sobj 是对象的引用,存储在栈中的是对象在堆中的地址。另外,"Hello, World!" 是一个字符串对象,存储在堆中,而 new Object() 是一个新的 Object 对象,也存储在堆中。

当程序执行到 Object obj = new Object(); 这一行代码时,会在堆中创建一个新的 Object 对象,并返回该对象的地址。这个地址被存储在栈中的 obj 变量中,表示 obj 变量引用了该对象。

当程序执行完 main 方法后,变量 isobj 所占用的栈空间会被自动回收。而堆中的对象则会被垃圾回收器自动回收,释放掉其占用的内存空间。