標籤:void 布爾 inter 自動清理 new t 棧空間 機制 引用傳遞 bsp
java這兩種資料類型分別有哪些?
java 中的資料類型分為兩大類:實值型別(基礎資料型別 (Elementary Data Type))和參考型別(複合資料型別)
一:實值型別:
整數類型(byte,short,int,long) 浮點類型(float,double) 布爾類型(boolean) 字元類型(char)
二:引用實值型別:
除了實值型別外就是引用實值型別了,引用實值型別有 類類型(class) 數組 介面類型(interface)
實值型別和參考型別的區別
值傳遞和引用傳遞
基礎資料型別 (Elementary Data Type)的賦值是值傳遞,當實值型別變數a賦值給實值型別變數b之後,再去改變a的值那麼b不會隨著a的改變而改變。
int a=1;int b=a;a=2;System.out.println("a:"+a+"b:"+b);
引用實值型別的賦值是引用傳遞,傳遞的是對象的引用地址。當引用實值型別變數a賦值給引用實值型別變數b之後,再去改變a的值那麼b會隨著a的改變而改變。
public class Test(){ int num; public Test(int num){ this.num=num; } public void steNum(int num){ this.num=num; } public static void main(String args[]){ Test ta= new Test(1); Test tb= new Test(); tb=ta; ta.setNum(2); System.out.println("ta:"+ta.num+"tb:"+tb.num); }}
2 記憶體配置
之所以會出現以上的現象是因為,實值型別資料和參考型別資料在在Java中的記憶體配置不一樣。
實值型別資料是直接儲存在棧中,Java JVM直接在棧中給資料開闢了一塊空間,直接儲存資料的值。
int a=1; //JVM為變數a在棧中開闢了一塊空間(假設為A),棧中儲存的是 1;int b=a; //JVM為變數b在棧中開闢另了一塊空間(假設為B),棧中儲存的也是 1; a=2; //為變數a重新賦值,棧空間A中儲存的值改為2,棧空間B中儲存的值不變為1
參考型別資料並不是直接儲存在棧中,Java JVM會在堆中給資料分配記憶體空間,堆儲存資料。棧儲存的是指向對應堆的地址。可以說是棧中的地址引用了堆中的資料。
Test ta= new Test(1);/* JVM為ta變數在堆中開闢一塊空間(假設為K),那麼堆空間K儲存的是 1;JVM為ta變數在棧中開闢一塊空間(假設為A),那麼棧空間A儲存的是指向堆空間的地址(假設為1000)*/Test tb= new Test(0);/* JVM為tb變數在堆中開闢一塊空間(假設為J),那麼堆空間J儲存的是 0;JVM為ta變數在棧中開闢一塊空間(假設為B),那麼棧空間B儲存的是指向堆空間的地址(假設為2000)*/tb=ta;/*棧空間B中儲存的地址從2000改為1000(從指向J改為指向K) 現在ta 和 tb 都引用堆空間K*/ta.setNum(2);/*堆空間K中儲存的值改為2 所以ta.num和tb.num 都是2 */
記憶體回收機制
當堆空間儲存的對象沒有被棧空間中儲存的地址所指向時(引用時),該對象會被自動清理掉。如前面提到的堆空間J中本來儲存著 0
Test tb= new Test(0);
但是
tb=ta;
不再有地址指向堆空間J中本來儲存的0,0會被自動清楚。
JAVA實值型別和參考型別的區別