最早的時候,我以為將物件轉換為object型別就是裝箱,將轉換後的ojbect轉換回具體的型別就是拆箱。後來才知道,值型別和引用型別之間的互相轉換才叫裝箱,拆箱。
裝箱和拆箱是有一定的效能損耗的,盡量避免無意義的裝箱拆箱,比如用泛型。
int x=2;object o=x;//這裡是裝箱
生成乙個新的引用物件(比如上面**中的o最後引用的物件)並在託管堆上為其分配記憶體。(我理解為這裡有個隱藏的 new object() )
將要裝箱的物件資料複製到新生成的物件上。(將x的值賦給 new object())
返回新物件的引用。(o被賦值,指向賦過值的new object())
在這3步中,生成乙個新的物件分配記憶體和複製資料是效能損耗的根本。而值得注意的是o指向的物件是乙個新的在託管堆中的物件,而不是在棧中的x,所以對這個新的物件作任何的改動都不會影響到原先的值物件。
獲取引用物件在託管堆中原值型別物件的值。((int)o)
將值賦值給值物件。(int y=)
假如這裡沒有第二步,直接這樣寫"((int)o).dosomething();",假如這個dosomething會改變值物件的值,那麼此時改變的是乙個臨時的值物件的值,而不是o的值。我理解為這裡在棧上又生成了乙個新的值物件。並且這個物件是臨時的,你沒法在下一條語句中獲它的值。
而如果是這樣的寫法"int y=(int)o;"則不會生成臨時的值物件。
裝箱和拆箱,自動裝箱和自動拆箱
以integer的建立為例。裝箱 把基本資料型別轉換成包裝類物件 int integer integer num1 new integer 17 拆箱 把乙個包裝類的物件,轉換成基本型別的變數 integer int int num2 num1.intvalue 自動裝箱 integer num3 ...
裝箱和拆箱
在c 中的有兩種型別的變數 值型別和引用型別。當值型別和引用型別相互轉化時,會發生裝箱和拆箱的過程。這裡有一點要宣告 經過拆箱或裝箱的物件會多出它自己乙份拷貝,如圖所示 從圖可以看出它和它的拷貝不在乙個儲存區域。這也是值型別和引用型別的區別所在。值型別總是在棧中,而引用型別總是在託管堆中。目前j2s...
裝箱和拆箱
裝箱 boxing 和拆箱 unboxing 是c 型別系統中重要的概念。它通過允許任何數值型別的資料被轉換為任何形式型別的物件提供了數值型別和引用型別間的緊密聯絡。裝箱和拆箱使得對在其中任何型別都可以最終被看作物件的型別系統的統一的觀察變為可能。裝箱轉換允許任何數值型別可以隱式地轉換為 objec...