一.先看一個題目
Java中的基本數據類型必定存儲在棧中嗎?java
二.答案說明
首先說明,"java中的基本數據類型必定存儲在棧中的嗎?」這句話確定是錯誤的。ide
基本數據類型是放在棧中仍是放在堆中,這取決於基本類型在何處聲明,下面對數據類型在內存中的存儲問題來解釋一下。code
三.局部變量存儲位置
在方法中聲明的變量,即該變量是局部變量對象
- 每當程序調用方法時,系統都會爲該方法創建一個方法棧,其所在方法中聲明的變量就放在方法棧中,當方法結束系統會釋放方法棧,其對應在該方法中聲明的變量隨着棧的銷燬而結束,這就局部變量只能在方法中有效的緣由。
- 在方法中聲明的變量能夠是基本類型的變量,也能夠是引用類型的變量。
- 當聲明是基本類型的變量的時,其變量名及值(變量名及值是兩個概念)是放在JAVA虛擬機棧中
- 當聲明的是引用變量時,所聲明的變量(該變量其實是在方法中存儲的是內存地址值)是放在JAVA虛擬機的棧中,該變量所指向的對象是放在堆類存中的
四.成員變量存儲位置
在類中聲明的變量是成員變量,也叫全局變量內存
- 放在堆中的(由於全局變量不會隨着某個方法執行結束而銷燬)。
- 一樣在類中聲明的變量便可是基本類型的變量,也但是引用類型的變量。
- 當聲明的是基本類型的變量其變量名及其值放在堆內存中的
- 引用類型時,其聲明的變量仍然會存儲一個內存地址值,該內存地址值指向所引用的對象。引用變量名和對應的對象仍然存儲在相應的堆中
五.靜態變量存儲位置
靜態變量其實就是常量虛擬機
- 注意是:存儲在JVM的方法區中
- static變量在類加載時被初始化,存儲在JVM的方法區中,整個內存中只有一個static變量的拷貝,可使用類名直接訪問,也能夠經過類的實例化對象訪問,通常不推薦經過實例化對象訪問,通俗的講static變量屬於類,不屬於對象,任何實例化的對象訪問的都是同一個static變量,任何地放均可以經過類名來訪問static變量。
六.舉例說明
此外,爲了反駁觀點" Java的基本數據類型都是存儲在棧的 ",咱們也能夠隨便舉出一個反例,例如:it
int[] array=new int[]{1,2};
因爲new了一個對象,因此new int[]{1,2}這個對象時存儲在堆中的,也就是說1,2這兩個基本數據類型是存儲在堆中,這也就頗有效的反駁了基本數據類型必定是存儲在棧中~~class