1)Java程序運(yùn)行時(shí),對(duì)象是怎么進(jìn)行安排放置的,內(nèi)存是怎么分配?Eckel在Thinking in java中對(duì)五個(gè)不同的存儲(chǔ)數(shù)據(jù)的地方進(jìn)行了簡(jiǎn)要的介紹:
a. 寄存器。最快的存儲(chǔ)區(qū)(位于處理器內(nèi)部),在Java里面,你不能直接控制,也不能在程序中感覺(jué)到寄存器的存在,可能是出于安全原因的考慮吧(C和C++允許編譯器建議寄存器的分配方式);
b. 堆棧。位于通用RAM,隨即訪問(wèn)存儲(chǔ)器中,但通過(guò)堆棧指針可以從處理器那里獲得直接支持。由于僅通過(guò)指針的上下移動(dòng)即可控制內(nèi)存,所以速度上僅次與寄存器 。然而Java系統(tǒng)需要知道存儲(chǔ)在堆棧的所有項(xiàng)的生命周期,所以靈活性不高。因此一般只存儲(chǔ)對(duì)象的引用,而不直接存儲(chǔ)對(duì)象(基本類型一般也存放在這里的)
c. 堆。通用的內(nèi)存池,也位于RAM。一般存放所有對(duì)象。堆是不用知道存儲(chǔ)的數(shù)據(jù)的存活時(shí)間的,當(dāng)需要一個(gè)對(duì)象的時(shí)候,通過(guò)new即可在堆里進(jìn)行存儲(chǔ)分配,這多少導(dǎo)致在清理堆的數(shù)據(jù)的不靈活性(基本類型的包裝器類存儲(chǔ)在堆中,也就是它是靠引用而“存活”的)
d. 常量存儲(chǔ)。常量值通常直接存放在程序代碼內(nèi)部。在必要的情況下,可以選擇將其放在ROM中(字符串池正是這樣的一個(gè)例子)
e. 非RAM存儲(chǔ)。放在非RAM存儲(chǔ)中目的主要是為了讓數(shù)據(jù)存活在程序之外,其中兩個(gè)基本的例子是流對(duì)象和持久化對(duì)象
2)在Java中,所有數(shù)值類型都有正負(fù)號(hào),所以不要尋找無(wú)符號(hào)的數(shù)值類型;
3)boolean類型所占存儲(chǔ)空間的大小沒(méi)有明確指定,僅定義為能夠取字面值true或false;
4)JavaSE5 自動(dòng)包裝功能將自動(dòng)將基本類型轉(zhuǎn)換為包裝器類型:
Character ch = 'x';
并可以方向轉(zhuǎn)換, char c = ch;
5)Java不允許重復(fù)定義相同名字的基本類型(C/C++可以)











6)基本類型的作用域和對(duì)象的作用域都受限于花括號(hào)“{}”,一旦超出它們所在的花括號(hào),那它們就消失了。但基本類型的消失是指在堆棧中的內(nèi)存被收回,而對(duì)象的消失只是在堆棧中的存放對(duì)象引用的內(nèi)存被收回,但其對(duì)象(堆中的)還存活,除非立刻通過(guò)垃圾回收機(jī)制回收了。這樣的設(shè)計(jì)有利于字符串池的實(shí)現(xiàn)
7)若類的某個(gè)成員是基本數(shù)據(jù)類型,即使沒(méi)有進(jìn)行初始化,也會(huì)獲得一個(gè)默認(rèn)值。然而對(duì)于“局部”變量,即并非某個(gè)類的字段,比如在某個(gè)方法在定義的,如果沒(méi)有進(jìn)行初始化,Java系統(tǒng)在編譯的時(shí)候會(huì)報(bào)錯(cuò)的。