1. 程式人生 > >JAVA中值型別和引用型別的不同(面試常考)

JAVA中值型別和引用型別的不同(面試常考)

轉載:https://www.cnblogs.com/1ming/p/5227944.html

1、 JAVA中值型別和引用型別的不同?

[定義] 

引用型別表示你操作的資料是同一個,也就是說當你傳一個引數給另一個方法時,你在另一個方法中改變這個變數的值,

那麼呼叫這個方法是傳入的變數的值也將改變.值型別表示複製一個當前變數傳給方法,

當你在這個方法中改變這個變數的值時,最初生命的變數的值不會變.通俗說法: 值型別就是現金,要用直接用;引用型別是存摺,要用還得先去銀行取現。----(摘自網上)

[值型別]

也就是基本資料型別 基本資料型別常被稱為四類八種

四類:  

 1,整型 2,浮點型 3,字元型4,邏輯型

八種:   

         1,整型3種 byte(2的3次方),short,int,long(2的6次方)

         2,浮點型2種 float,double

         3,字元型1種 char

         4,邏輯型1種 boolean

[引用型別]

除了四類八種基本型別外,所有的型別都稱為引用型別(陣列,類,介面,字串)

在弄清楚值型別與引用型別之後,最後一點就是值傳遞與引用傳遞,這才是關鍵

[值傳遞]    

基本資料型別賦值都屬於值傳遞,值傳遞傳遞的是實實在在的變數值,是傳遞原引數的拷貝,值傳遞後,實參傳遞給形參的值,形參發生改變而不影響實參。

[引用傳遞]

引用型別之間賦值屬於引用傳遞。引用傳遞傳遞的是物件的引用地址,也就是它的本身(自己最通俗的理解)。

引用傳遞:傳的是地址,就是將實參的地址傳遞給形參,形參改變了,實參當然被改變了,因為他們指向相同的地址。

引用和我們的指標差不多,但是它不又不需要我們去具體的操作

 [記憶體分配]

一個具有值型別(value type)的資料存放在棧內的一個變數中。即是在棧中分配記憶體空間,直接儲存所包含的值,其值就代表資料本身。

值型別的資料具有較快的存取速度。

一個具有引用型別(reference type)的資料並不駐留在棧中,而是儲存於堆中。即是在堆中分配記憶體空間,不直接儲存所包含的值,而是指向所要儲存的值,其值代表的是所指向的地址。當訪問一個具有引用型別的資料時,需要到棧中檢查變數的內容,該變數引用堆中的一個實際資料。引用型別的資料比值型別的資料具有更大的儲存規模和較低的訪問速度。

Java中有垃圾回收機制,棧記憶體中的變數隨著方法的結束記憶體自然銷燬了,而用引用型別的時候,當方法結束的時候,這個物件可能被另一個引用型別所應用,不會銷燬,只有當一個物件沒有任何引用變數引用的時候,垃圾回收機制才會回收

2,為什麼Java中資料的存放有堆和棧之分?