什麼是包裝類?
Java設計中一個核心的原則,即萬物皆對象,也就是說一切要求用對象的形式描述,但是基本數據類型不是對象,這就很尷尬 矛盾了,爲了解決這個尷尬 矛盾,採用 把基本數據類型包裝成一個對象,以面向對象的思想去使用這些類型。
包裝類作用?
採用基本數據類型包裝的形式描述,讓功能變得更加健壯,例如: Integer默認不是int的 0 而是 null ,那麼比起基本數據類型,包裝類對象它就多了一個狀態,就像你打王者,除了0代表你沒戰績,null 還可以代表你中途跑路了。
還有一個比較直觀的,就是包裝類給我們提供了很多方法可以使用,例如:數據可以轉二進制,查看最大值最小值等等。
除了上面還有一個要點: 集合中不能存放基本數據類型,只能存放對象 所以當使用集合時,我們的就需要使用到包裝類對象。
何爲裝箱拆箱?
裝箱:基本數據類型轉換成對應的包裝類對象。
拆箱:包裝類對象轉換成對應的基本數據類型。
(裝箱拆箱,自動裝拆箱操作往下看)
Java提供了8種數據類型,對應8種包裝類型
基本數據類型 | 包裝類型 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Byte |
注意點:
是不是有人會疑問呢?怎麼沒有String呢???
或者壓根看到我這段文字的的小夥伴才發現的,是不是平時吹基本數據類型把String也帶上了 (→_→)
記住啦 在Java中String 不屬於基本類型,String 是一個對象
好了,進入主題
裝箱操作
把基本類型轉換成對應的包裝類對象
第一種裝箱方式:直接使用new
int i = 10;
Integer num = new Integer(i);
System.out.print(num);
第二種裝箱方式:調用valueOf()的方式
Integer num_2 = Integer.valueOf(20);
System.out.println("調用valueOf()的方式:" + num_2);
運行結果
擴展點:
細心的小夥伴你會發現,咦,打印對象不應該是地址嗎,竟然是數字?
說明了什麼?
包裝類內部也覆蓋了toString
public String toString() {
return toString(value);
}
拆箱操作
與裝箱相反,把包裝類對象轉成對應的基本數據類型
調用intValue方式拆箱,這裏其實就是將Integer類型轉化爲Int類型
Integer num_1 = Integer.valueOf(20);
int num_2 = num_1.intValue();
System.out.println(num_1);
System.out.println(num_2);
運行結果
(很直觀的區別在於num_1變量是Integer包裝類對象所以可以調用方法,而num_2是基本類型int不能)
自動裝箱
基本數據類型直接賦值給包裝類對象
Integer num_1 = 66;
System.out.println(num_1);
自動拆箱
包裝類對象直接賦值給基本數據類型
Integer num_1 = 66;
int num_2 = num_1;
System.out.println(num_2);
運行結果
很神奇是不是??
不用我們自己親自去裝箱拆箱
信你這顆剽悍的種子!壞得很 (●ˇ∀ˇ●)
那誰幫我們做了?
當然是我們的JVM啦,在我們編譯的時候幫我們加上了valueOf,裝箱了
想問我怎麼知道的?
偷偷告訴你,用反編譯工具查看編譯後的class文件,有碼有真相
編譯的時候幫你加上了,沒想到吧,哈哈
這種方式有一個術語稱爲: 語法糖
吃了這顆語法糖,該乾的活,幫你幹了,果然很甜呀
自動裝箱拆箱 本質上是編譯的時候幫你加上 valueOf 或 intValue
自動裝箱 valueOf
Integer num_1 = Integer.valueOf(66);
自動拆箱 intValue
int num_2 = num_1.intValue();
最後:
如果再深入一些,還可以再剖析一下 valueOf 和 intValue 這兩個關鍵字的一些機制的,但是昨日這篇寫了我一天,今早也還在修修補補,時光來去總是匆匆,我想我只能留下次來寫了,寫博客以來,寫的很慢,但也寫的很較真,因爲 把我會的,認真的分享 ,是我 一顆剽悍的種子 寫博客一直不變的信條。如果你能看到這篇,說明咱們還是很有緣的,希望能帶給你一些許幫助,創作的不易, 把我文章的知識帶走,你的三連留下,點贊,評論,關注,是我最大的動力。