1. 程式人生 > >值類型和引用類型的詳細討論

值類型和引用類型的詳細討論

width 對象實例 int 規範 沒有 情況 變量引用 進行 調用

值類型:(原話定義)值類型的變量直接包含值,換言之變量引用的位置就是值在內存中實際存儲的位置。

這句話也就是說,值類型的賦值是不會引用同一內存位置的,除了out和ref參數,更改原始變量不影響其它變量的值(因為變量歌有各的位置)

技術分享

依次向下:

int number1 =42;

char letter =‘A‘;

float pi = 3.14;

int number2 = number1;

總結:值類型的賦值會單獨開辟一個新的內存空間,這就引發了另兩個問題,第一個是空間占用問題,所以,規範是不要創建內存大於16字節的值類型。第二個問題,由於值類型的值一般只能短時間存在,大多情況下,值類型的值和臨時值是存儲在稱為棧的臨時存儲區中,然而,臨時區清理的代價低於需要進行垃圾回收的堆,但是,值類型會更加頻繁地去復值,增加性能開銷,這點得註意;

引用類型:它得值是對一個對象的實例的引用,引用類型的變量是引用(通常是內存地址),去那個位置找到對象實例的數據。因此,”運行時“要從變量讀取引用,然後根據引用找到資源,從而到達實際包含實例數據的內存位置。即引用類型的變量關聯了兩個存儲位置。

引用類型指向堆,但是引用類型與變量關聯的存儲位置和值類型並沒有區別;若變量短時間存在,就在臨時存儲區分配它,對於引用類型的變量,它的值要麽是null,要麽是對需要進行垃圾回收的堆上的一個存儲位置的引用。

總結:由於引用類型只復制對數據的引用,因此兩個變量客引用相同的數據,這樣,賦值和方法調用都將改變相同引用變量的值;

技術分享

值類型和引用類型的詳細討論