java中數據的基本類型分爲:基本數據類型和引用數據類型,對此不多介紹;
接下來討論一下java中數據類型存儲在哪基本數據類型存儲在哪,取決於基本類型在哪聲明:
1.基本數據類型在方法中聲明時,其變量名和值都是存儲在java棧中的;在方法中聲明基本類型數據:
例: int a = 10
①在棧中聲明一個變量名爲a的引用;
②在棧中查找是否有字面值爲10的地址,如果沒有就開闢一個存放字面值是10的地址;
③將變量名爲a的引用指向字面值爲10的地址;
2.基本數據類型在類中聲明時則是存儲在堆內存中的;
①在類中聲明的基本數據類型,在類加載時會存儲到方法區中;
②在java堆中從生成代表這個類的java.lang.Class對象,作爲方法區這些數據的訪問入口;
③ static關鍵字修飾的數據是屬於類本身的,存儲在方法區中;
④ final關鍵詞修飾的數據表示引用不變的,存儲在常量池中;
3.基本數據類型的包裝類:
① Integer i = 10;同 i = 10的聲明過程。
② Integer i = new Integer(10);數據10是存儲在堆中的;
引用數據類型一定輸存儲在堆中的嗎?
1.特殊的String類
例 : String str = “abc”;
①在棧中聲明一個變量名爲str的引用;
②在常量池中查找是否有“abc”的字符串對象,如果沒有就在常量池中創建存儲一個值爲“abc”的字符串對象;
③將str的引用指向字符串對象“abc”;
④當再次聲明 String str1 = "abc",常量池中已經有“abc”對象,所以str1直接指向abc的地址;
⑤ str = str1,引用數據類型比較,比較的是應用的地址;
注: String str = “abc”沒有創建或創建一個對象
2.其他引用類型
Stirng str = new String("abc");
①在棧中聲明一個變量名爲str的引用;
②在堆中創建存儲一個字符串對象“abc”;
③檢查常量池中是否有字符串對象“abc”,如果沒有就在常量池中創建存儲一個值爲“abc”的字符串對象;
④將堆中字符串對象“abc”與常量池中字符串對象“abc”聯繫起來,可以用intern方法返回常量池中的對象的引用;
⑤ 將str的引用指向堆中字符串對象“abc”;
注: String str = new String ("abc")創建一個或兩個對象。