堆栈帧仅在方法调用的生命周期内存在,这意味着分配内存以存储所有局部变量和方法参数,这些变量和方法参数以某种方式帮助帮助方法实现其任务目标它着手实现。
堆栈帧中的内存存储示例是临时指针,用于跟踪您正在迭代的数组中的索引位置。循环结束后,栈帧会从栈中弹出,这意味着分配给局部变量和方法参数的所有临时内存都被释放回系统中。
堆是不同的,因为它是对象所在的地方,而不是指向对象的“指针”。
当我学习时,我发现很难弄清楚两者之间的区别。
帮助我的关键点是,指向对象的指针保存在堆栈帧中,它分配了一点临时内存,在方法调用的整个生命周期中都存在。因此,您只能在方法处于“范围”内时访问对象。
指针包含一个内存地址,该地址指向存储在堆上的对象的位置。这允许您引用对象以在以后更改对象状态。
public static void main(String[] args)
{
Person person = new Person("Steven", 30);
}
当你运行这个程序时:
- new 关键字意味着 java 将在堆上为存储 Person 对象实例变量所需的空间分配内存。
要理解的重要部分是,存储对象方法不需要内存。调用方法时,会创建一个新的堆栈帧,该堆栈帧会在方法调用期间分配临时内存。使用上面的例子,一个 Person 有 2 个实例变量,一个 String name 和一个 int age。这意味着此 Person 对象所需的内存是存储 String 类型的 reference 变量(堆上 String 对象的内存地址的位模式)和保存该位所需的内存int 的模式。
最后,main 方法也是一个堆栈帧,因此当 main 完成时,您不再拥有对 Person 对象的引用或访问可能存在于 main 中的任何临时变量。
对于任何方法都是如此,如果您有一个创建对象但不返回对该对象的引用的方法,那么您将永远无法访问该对象,Java 垃圾收集器稍后会出现并清理堆上所有没有指向它们的引用的对象。
如果你刚开始,我强烈建议你先用 java。这是一本很棒的 IMO 书籍,以易于理解的方式涵盖了这些主题。