下列Java代碼中變量a、b、c分別在內存的()存儲區存放。
class A{ private String a = "a"; public boolean methodB(){ String b = "bb"; final String c = "cc"; } }
A:堆區、堆區、堆區
B:堆區、棧區、堆區
C:堆區、棧區、棧區
D:堆區、堆區、棧區
E:靜態區、棧區、堆區
F:靜態區、棧區、棧區
解析:
a屬於A類的成員變量。在String a = "aa"涉及對象實例到在堆上給"aa"分配內存。《深入理解Java虛擬機》Java堆區域唯一目的就是存放對象實例,幾乎所有的對象實例都在這里分配內存。
在《深入理解Java虛擬機》中虛擬機棧描述的是Java方法執行的內存模型:每一個方法在執行的同時都會創建一個棧幀用於存儲局部變量表、操作數棧、動態鏈表、方法出口等信息。每一個方法從調用直至執行完成的過程就對應着一個棧幀在虛擬機棧中入棧到出棧的過程。
局部變量表存放了編譯器可知的各種基本數據類型(boolean、byte、char、short、int、float、long、double)、對象引用(reference類型,它不等同於對象本身,可能是一個指向對象起始地址的引用指針,也可能是指向一個代表對象的句柄或其他與此對象相關的位置)和returnAddress類型(指向了一條字節碼指令的地址)。注意:基本數據類型不包括String。這里可以肯定b變量在內存的棧存儲區存放。
至於final修飾String感覺有些多余,因為String本身就是一個final型,故c變量在內存的棧存儲區存放。
分享此題解法,不知道這樣理解對不對,如若有問題大家一起來討論。
