18 JVM中的变量
在 food 背后,有一个与它对应的 klass 对象,它记录了 food 的类型信息,就像是有一个标签写着 food 的品类和特点。每个 klass 对象维护着一个虚函数表,记录了类中所有的虚函数以及对应的指针。当 food 调用一个方法时,JVM 根据它的实际类型找到它的 klass 对象,然后在虚函数表中寻找正确的函数指针,使得 food 能够调用正确的方法。这种实现方式让我们具备了多态性,让它的行为可以根据实际情况进行适应。
生存空间
首先,栈上的变量是局部变量,包括方法中定义的变量和代码块中定义的变量。它们的生命周期与方法调用或代码块的执行周期相同。变量在栈上的创建非常快速,而且在方法或代码块执行结束后会自动销毁。在使用栈上的变量之前,必须显式地为其赋值。
堆中的变量是通过 new 关键字创建的对象和数组。它们的生命周期与对象或数组本身相同,当没有引用指向它们时,会被垃圾收集器回收。堆中的变量创建比较耗时,需要为对象或数组分配内存空间,并进行初始化。在对象创建时,成员变量会被赋予默认值。
方法区中的变量主要是静态变量。它们的生命周期与类的生命周期相同,在类被加载时创建,在类被卸载时销毁。静态变量在方法区中创建并初始化,在使用之前已经具有默认值。