數據類型分爲兩種:值類型和引用類型,這兩種類型的對象在內存的存儲方式不同。
定義:
引用類型:表示操作的對象是同一個,即當傳一個參數給另一個方法時,在另一個方法中改變這個變量的值,那麼調用這個方法時傳入的值也將發生變化。
值類型:表示複製一個當前變量傳遞給方法,在方法中改變這個值時,最初生命的變量值不會改變。
值類型
值類型及基本數據類型,常被分爲四類八種:
四類:整型,浮點型,字符型,邏輯型
八種:1,整型3種 byte, short, int, long
2,浮點型 float, double
3,字符型 char
4,邏輯型 boolean
引用類型
除了四類八種的基本類型,其他數據類型都是引用類型,例如:string類型,object類型等。
傳遞:
值傳遞:基本數據類型複製都屬於值傳遞。傳遞的是實實在在的變量值,是原參數的拷貝,實參傳遞給形參的值,形參發生變化而不影響實參。
引用傳遞:引用類型之間的賦值屬於引用傳遞。傳遞的對象是引用的地址,即將實參的地址傳遞給形參,形參改變了實參也相應發生變化,因爲指向同一個地址。
存儲:
1. 值類型:只需一段單獨的內存,用於存儲時間的數據。
引用類型:需要兩端內存:
第一段:實際數據,總是位於堆中
第二段:一個引用,指向數據在堆中的存儲位置
數據如果不是其他類型的成員就會像下圖一樣存貯,對於值類型數據放在棧中。對於引用類型數據放在堆中而引用放在棧中
2.存儲引用類型對象的成員
引用類型對象的數據始終存儲在堆中,如下圖。
值類型數據,或引用類型數據的引用可以放在堆裏,也可以放在棧裏。
例如:引用類型的對象名稱爲MyType,有兩個成員:一個值類型成員和一個引用類型成員,將如何存儲呢?
對於一個引用類型,其實例的數據始終放在堆裏。既然兩個成員都是對象數據的一部分,那麼他們都會被放在堆裏,無論是值類型還是引用類型 如圖:
裝箱和拆箱
裝箱就是值類型轉化爲引用類型的過程。將一個值類型變量裝箱成一個引用類型變量,首先會在託管堆上爲新的引用類型變量分配內存空間,然後將值類型變量拷貝到託管堆上新分配的對象內存中,然後返回新分配的對象內存地址。