1. 程式人生 > >C#值型別和引用型別 vs Java值型別和引用型別

C#值型別和引用型別 vs Java值型別和引用型別

C#和Java中物件分為值型別和引用型別,不同型別的物件儲存方式不同,如果想要深入瞭解程式首先要分清楚:哪些是值型別?哪些是引用類?

C#中值型別和引用型別

這裡寫圖片描述
區別:
1、值型別分配在棧上,它的變數直接儲存變數的物件。
2、引用型別分配在棧上,它的變數通常儲存一個指向物件的指標,變數通過該指標來引用物件,物件儲存在託管堆中。
3、值型別繼承自ValueType(注意:System.Value又繼承自System.Object);引用型別繼承自System.Object。
4、值型別變數儲存其例項資料,因此在預設情況下,值型別的引數傳遞不會影響引數本身;而引用型別變數儲存其資料在託管堆中的地址,因此以引用方式進行引數傳遞會影響到引數本身,因為兩個變數引用了記憶體中的同一塊地址。
5、值型別有裝箱和拆箱兩種表示,執行庫提供了所有值型別的已裝箱形式;而引用型別只有裝箱形式。
6、值型別的記憶體不由GC控制,作用域結束時值型別會自動釋放,減少了託管堆的壓力,因此具有效能上的優勢。例如:通常struct比class更高效;引用型別的記憶體回收由GC來完成。
7、值型別是密封的(sealed),不能作為其他任何型別的基類,但是可以單繼承或多繼承介面;而引用型別一般都有繼承性。
8、值型別不具有多型性;而引用型別具有多型性。
9、值型別變數不可為null值,值型別變數都會自動初始化為0值;而引用型別變數預設情況下建立為null值,表示沒有儲存任何指向託管堆的引用地址。對值為null的引用型別物件做任何操作,都會丟擲NullReferenceException異常。
值型別預設值截圖:
這裡寫圖片描述


引用型別預設值截圖:
這裡寫圖片描述

Java中值型別和引用型別

Java中值型別只有八種,沒看錯只有八種:byte、short、int、long、float、double、char、boolean,其餘的全部都是引用型別。