首先說明,"java中的基本數(shù)據(jù)類型一定存儲在棧中的嗎?”這句話肯定是錯(cuò)誤的。
下面讓我們一起來分析一下原因:
基本數(shù)據(jù)類型是放在棧中還是放在堆中,這取決于基本類型在何處聲明,下面對數(shù)據(jù)類型在內(nèi)存中的存儲問題來解釋一下:
一:在方法中聲明的變量,即該變量是局部變量,每當(dāng)程序調(diào)用方法時(shí),系統(tǒng)都會為該方法建立一個(gè)方法棧,其所在方法中聲明的變量就放在方法棧中,當(dāng)方法結(jié)束系統(tǒng)會釋放方法棧,其對應(yīng)在該方法中聲明的變量隨著棧的銷毀而結(jié)束,這就局部變量只能在方法中有效的原因
在方法中聲明的變量可以是基本類型的變量,也可以是引用類型的變量。
(1)當(dāng)聲明是基本類型的變量的時(shí),其變量名及值(變量名及值是兩個(gè)概念)是放在JAVA虛擬機(jī)棧中
(2)當(dāng)聲明的是引用變量時(shí),所聲明的變量(該變量實(shí)際上是在方法中存儲的是內(nèi)存地址值)是放在JAVA虛擬機(jī)的棧中,該變量所指向的對象是放在堆類存中的。
二:在類中聲明的變量是成員變量,也叫全局變量,放在堆中的(因?yàn)槿肿兞坎粫S著某個(gè)方法執(zhí)行結(jié)束而銷毀)。
同樣在類中聲明的變量即可是基本類型的變量 也可是引用類型的變量
(1)當(dāng)聲明的是基本類型的變量其變量名及其值放在堆內(nèi)存中的
(2)引用類型時(shí),其聲明的變量仍然會存儲一個(gè)內(nèi)存地址值,該內(nèi)存地址值指向所引用的對象。引用變量名和對應(yīng)的對象仍然存儲在相應(yīng)的堆中
此外,為了反駁觀點(diǎn)" Java的基本數(shù)據(jù)類型都是存儲在棧的 ",我們也可以隨便舉出一個(gè)反例,例如:
int[] array=new int[]{1,2};
由于new了一個(gè)對象,所以new int[]{1,2}這個(gè)對象時(shí)存儲在堆中的,也就是說1,2這兩個(gè)基本數(shù)據(jù)類型是存儲在堆中,
這也就很有效的反駁了基本數(shù)據(jù)類型一定是存儲在棧中~~