如何理解《Java编程思想-第四版》P23 中,这个变量直接存储“值”,并置于堆栈中,因此更加高效
一句中的 “堆栈” 两字,到底是堆还是栈?情况如下:
class demo {
private int var1; // 字段1
private Integer var2; // 字段2
public static void main(String[] args) {
int var3 = 0; // 变量1
demo obj1 = new demo(); // 实例1
}
}
参考《Java编程思想-第四版》P23 和 《深入理解Java虚拟机:JVM高级特性与最佳实践 第2版》P39-P43,对于该 demo
实例1:存储在堆内存中
变量1:存储在方法栈中
实例1中的字段1:存储在堆中
实例1中的字段2:存储在堆中
如果是存储在堆中的话,何来高效一说?
我們不能一概而論的說,基本型態資料都是放在堆疊中的!當某個 類別實例 中具有基本型別時,基本型別就放在堆中!
記憶體分為堆和棧,這你已經知道了。
堆記憶體是屬於JVM的,棧記憶體是屬於方法的,方法結束了,棧記憶體也就沒了。
程式運行main函數時,有一個堆內存,一個main的棧內存
int var3 = 0;
這個var3,是放在main函數的棧記憶體中的,是一個值。
之後
demo obj1 = new demo();
main函數的棧內存中有了一個引用變量,obj1,指向了堆內存中new出來的這個實例。
我們再看堆記憶體中的這個實例,他有2個字段,他們都是存放在堆中的。
等到main函數運行結束時,假如還有別的線程在運行,JVM還沒結束,此時,main函數的棧內存被清除,var3,不在了,obj1這個引用變量也不在了,但是堆內存中的那個實例依然在,如果沒有別的引用變數指向它,那麼它將在稍後被清除。
是翻譯錯誤,譯文中用的是stack,即棧,而不是堆疊。以下是譯本:
p22,堆疊指的是stack,堆指的是heap