假设有这么一个程序:
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'的值。而 s 和 obj 是对象的引用,存储在栈中的是对象在堆中的地址。另外,"Hello, World!" 是一个字符串对象,存储在堆中,而 new Object() 是一个新的 Object 对象,也存储在堆中。
当程序执行到 Object obj = new Object(); 这一行代码时,会在堆中创建一个新的 Object 对象,并返回该对象的地址。这个地址被存储在栈中的 obj 变量中,表示 obj 变量引用了该对象。
当程序执行完 main 方法后,变量 i、s 和 obj 所占用的栈空间会被自动回收。而堆中的对象则会被垃圾回收器自动回收,释放掉其占用的内存空间。