亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

java自動(dòng)裝箱拆箱深入剖析

 更新時(shí)間:2012年11月14日 11:15:46   作者:  
基本數(shù)據(jù)(Primitive)類型的自動(dòng)裝箱(autoboxing)、拆箱(unboxing)是自J2SE 5.0開(kāi)始提供的功能。java語(yǔ)言規(guī)范中說(shuō)道:在許多情況下包裝與解包裝是由編譯器自行完成的(在這種情況下包裝成為裝箱,解包裝稱為拆箱)
這個(gè)是jdk1.5以后才引入的新的內(nèi)容,作為秉承發(fā)表是最好的記憶,毅然決定還是用一篇博客來(lái)代替我的記憶:
java語(yǔ)言規(guī)范中說(shuō)道:在許多情況下包裝與解包裝是由編譯器自行完成的(在這種情況下包裝成為裝箱,解包裝稱為拆箱);
其實(shí)按照我自己的理解自動(dòng)裝箱就可以簡(jiǎn)單的理解為將基本數(shù)據(jù)類型封裝為對(duì)象類型,來(lái)符合java的面向?qū)ο?;例如用int來(lái)舉例:

復(fù)制代碼 代碼如下:

//聲明一個(gè)Integer對(duì)象
Integer num = 10;
//以上的聲明就是用到了自動(dòng)的裝箱:解析為
Integer num = new Integer(10);以上就是一個(gè)很好的體現(xiàn),因?yàn)?0是屬于基本數(shù)據(jù)類型的,原則上它是不能直接賦值給一個(gè)對(duì)象Integer的,但jdk1.5后你就可以進(jìn)行這樣的聲明,這就是自動(dòng)裝箱的魅力
自動(dòng)將基本數(shù)據(jù)類型轉(zhuǎn)化為對(duì)應(yīng)的封裝類型。成為一個(gè)對(duì)象以后就可以調(diào)用對(duì)象所聲明的所有的方法
自動(dòng)拆箱:故名思議就是將對(duì)象重新轉(zhuǎn)化為基本數(shù)據(jù)類型:
//裝箱
Integer num = 10;
//拆箱
int num1 = num;自動(dòng)拆箱有個(gè)很典型的用法就是在進(jìn)行運(yùn)算的時(shí)候:因?yàn)閷?duì)象時(shí)不恩直接進(jìn)行運(yùn)算的,而是要轉(zhuǎn)化為基本數(shù)據(jù)類型后才能進(jìn)行加減乘除
Integer num = 10;
//進(jìn)行計(jì)算時(shí)隱含的有自動(dòng)拆箱
System.out.print(num--);哈哈 應(yīng)該感覺(jué)很簡(jiǎn)單吧,下面我再來(lái)講點(diǎn)稍微難點(diǎn)的,
//在-128~127 之外的數(shù)
Integer num1 = 297; Integer num2 = 297;
System.out.println("num1==num2: "+(num1==num2));
// 在-128~127 之內(nèi)的數(shù)
Integer num3 = 97; Integer num4 = 97;
System.out.println("num3==num4: "+(num3==num4)); 打印的結(jié)果是:num1==num2: false num3==num4: true

很奇怪吧:這就歸結(jié)于java對(duì)于Integer與int的自動(dòng)裝箱與拆箱的設(shè)計(jì),是一種模式:叫享元模式(flyweight)
為了加大對(duì)簡(jiǎn)單數(shù)字的重利用,java定義:在自動(dòng)裝箱時(shí)對(duì)于值從–128到127之間的值,它們被裝箱為Integer對(duì)象后,會(huì)存在內(nèi)存中被重用,始終只存在一個(gè)對(duì)象
而如果超過(guò)了從–128到127之間的值,被裝箱后的Integer對(duì)象并不會(huì)被重用,即相當(dāng)于每次裝箱時(shí)都新建一個(gè) Integer對(duì)象;明白了吧 
以上的現(xiàn)象是由于使用了自動(dòng)裝箱所引起的,如果你沒(méi)有使用自動(dòng)裝箱,而是跟一般類一樣,用new來(lái)進(jìn)行實(shí)例化,就會(huì)每次new就都一個(gè)新的對(duì)象;
這個(gè)的自動(dòng)裝箱拆箱不僅在基本數(shù)據(jù)類型中有應(yīng)用,在String類中也有應(yīng)用,比如我們經(jīng)常聲明一個(gè)String對(duì)象時(shí):
復(fù)制代碼 代碼如下:

String str = "sl";
//代替下面的聲明方式
String str = new String("sl");

基本數(shù)據(jù)(Primitive)類型的自動(dòng)裝箱(autoboxing)、拆箱(unboxing)是自J2SE 5.0開(kāi)始提供的功能。雖然為您打包基本數(shù)據(jù)類型提供了方便,但提供方便的同時(shí)表示隱藏了細(xì)節(jié),建議在能夠區(qū)分基本數(shù)據(jù)類型與對(duì)象的差別時(shí)再使用。
autoboxing和unboxing
在Java中,所有要處理的東西幾乎都是對(duì)象 (Object),例如之前所使用的Scanner是對(duì)象,字符串(String)也是對(duì)象,之后還會(huì)看到更多的對(duì)象。然而基本(Primitive)數(shù)據(jù)類型不是對(duì)象,也就是您使用int、double、boolean等定義的變量,以及您在中直接寫下的字面常量。
在前一個(gè)小節(jié)中已經(jīng)大致看到了操作對(duì)象的方便性,而使用Java有一段時(shí)間的人都知道,有時(shí)需要將基本數(shù)據(jù)類型轉(zhuǎn)換為對(duì)象。例如使用Map對(duì)象要put()方法時(shí),需要傳入的參數(shù)是對(duì)象而不是基本數(shù)據(jù)類型。
要使用打包類型(Wrapper Types)才能將基本數(shù)據(jù)類型包裝為對(duì)象,前一個(gè)小節(jié)中您已經(jīng)知道在J2SE 5.0之前,要使用以下語(yǔ)句才能將int包裝為一個(gè)Integer對(duì)象:Integer integer = new Integer(10);
在 J2SE 5.0之后提供了自動(dòng)裝箱的功能,您可以直接使用以下語(yǔ)句來(lái)打包基本數(shù)據(jù)類型:Integer integer = 10;
在進(jìn)行編譯時(shí),編譯器再自動(dòng)根據(jù)您寫下的語(yǔ)句,判斷是否進(jìn)行自動(dòng)裝箱動(dòng)作。在上例中integer參考的會(huì)是Integer類的實(shí)例。同樣的動(dòng)作可以適用于 boolean、byte、short、char、long、float、double等基本數(shù)據(jù)類型,分別會(huì)使用對(duì)應(yīng)的打包類型(Wrapper Types)Boolean、Byte、Short、Character、Long、Float或Double。下面直接使用自動(dòng)裝箱功能來(lái)改寫范例 4.4。

范例4.5 AutoBoxDemo.java
復(fù)制代碼 代碼如下:

public class AutoBoxDemo {
public static void main(String[] args) {
Integer data1 = 10;
Integer data2 = 20;
// 轉(zhuǎn)為double值再除以3
System.out.println(data1.doubleValue() / 3);
// 進(jìn)行兩個(gè)值的比較
System.out.println(data1.compareTo(data2));
}
}

程序看來(lái)簡(jiǎn)潔了許多,data1與data2在運(yùn)行時(shí)就是Integer的實(shí)例,可以直接進(jìn)行對(duì)象操作。的結(jié)果如下:
3.3333333333333335
–1
自動(dòng)裝箱運(yùn)用的方法還可以如下:
復(fù)制代碼 代碼如下:

int i = 10;
Integer integer = i;

也可以使用更一般化的java.lang.Number類來(lái)自動(dòng)裝箱。例如:
Number number = 3.14f;
3.14f會(huì)先被自動(dòng)裝箱為Float,然后指定給number。
從J2SE 5.0開(kāi)始可以自動(dòng)裝箱,也可以自動(dòng)拆箱(unboxing),也就是將對(duì)象中的基本數(shù)據(jù)形態(tài)信息從對(duì)象中自動(dòng)取出。例如下面這樣寫是可以的:
復(fù)制代碼 代碼如下:

Integer fooInteger = 10;
int fooPrimitive = fooInteger;

fooInteger引用至自動(dòng)裝箱為Integer的實(shí)例后,如果被指定給一個(gè)int類型的變量fooPrimitive,則會(huì)自動(dòng)變?yōu)閕nt類型再指定給fooPrimitive。在運(yùn)算時(shí),也可以進(jìn)行自動(dòng)裝箱與拆箱。例如:
復(fù)制代碼 代碼如下:

Integer i = 10;
System.out.println(i + 10);
System.out.println(i++);

上例中會(huì)顯示20與10,編譯器會(huì)自動(dòng)進(jìn)行自動(dòng)裝箱與拆箱,也就是10會(huì)先被裝箱,然后在i + 10時(shí)會(huì)先拆箱,進(jìn)行加法運(yùn)算;i++該行也是先拆箱再進(jìn)行遞增運(yùn)算。再來(lái)看一個(gè)例子:
復(fù)制代碼 代碼如下:

Boolean boo = true;
System.out.println(boo && false);

同樣的boo原來(lái)是Boolean的實(shí)例,在進(jìn)行AND運(yùn)算時(shí),會(huì)先將boo拆箱,再與false進(jìn)行AND運(yùn)算,結(jié)果會(huì)顯示false。
//////////////////////////////////////////////////////////////////
裝箱:從基本類型轉(zhuǎn)換成Object類型,稱之為裝箱;***拆箱:從Object轉(zhuǎn)換乘基本類型的操作,稱之為拆箱。 這個(gè)操作在反射過(guò)程中用的比較的多。
裝箱:在堆中建立一個(gè)Object實(shí)例,把你指定的值復(fù)制成去;***拆箱:判別引用指向的堆中信息是否是要拆成的類型,是取出堆中值送給棧中變量,否則報(bào)異常
///////////////////////////////////////////////////////////////////
裝箱是值類型到object類型或到該值類型所實(shí)現(xiàn)的任何接口類型的隱士轉(zhuǎn)換。
將一個(gè)值類型裝箱會(huì)分配一個(gè)對(duì)象實(shí)例并將該值復(fù)制到新的對(duì)象中。
復(fù)制代碼 代碼如下:

int i=123;
object o=i;

這句話的結(jié)果是在堆棧上創(chuàng)建一個(gè)對(duì)象o,而該對(duì)象在堆上引用int類型的值。該值是賦值給變量i
的值類型值的一個(gè)副本。
下面是顯示執(zhí)行裝箱轉(zhuǎn)換
復(fù)制代碼 代碼如下:

int i=123;
ojbect o=(object)i;

此例將整數(shù)變量i通過(guò)裝箱轉(zhuǎn)換為對(duì)象o。這樣,存儲(chǔ)在變量i中的值就從123改為456。此例顯示對(duì)象保留了內(nèi)容的原始副本。即123。
取消裝箱是從object類型到值類型或從接口類型到實(shí)現(xiàn)該接口的值類型的顯示轉(zhuǎn)換。取消裝箱操作包括:
檢查對(duì)象實(shí)例,確保它是給定值類型的一個(gè)裝箱值。
將該值從實(shí)例復(fù)制到值類型變量中。
例子:
復(fù)制代碼 代碼如下:

int i=123;
object box=i;
int j=(int)box;

相關(guān)文章

  • 解析SpringBoot @EnableAutoConfiguration的使用

    解析SpringBoot @EnableAutoConfiguration的使用

    這篇文章主要介紹了解析SpringBoot @EnableAutoConfiguration的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • java數(shù)據(jù)結(jié)構(gòu)算法稀疏數(shù)組示例詳解

    java數(shù)據(jù)結(jié)構(gòu)算法稀疏數(shù)組示例詳解

    這篇文章主要為大家介紹了java數(shù)據(jù)結(jié)構(gòu)算法稀疏數(shù)組示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Java中Volatile的作用實(shí)例解析

    Java中Volatile的作用實(shí)例解析

    本篇文章給大家通過(guò)實(shí)例分享了Java中Volatile的作用,有興趣的朋友可以學(xué)習(xí)參考下。
    2018-07-07
  • Java把數(shù)字格式化為貨幣字符串實(shí)例代碼

    Java把數(shù)字格式化為貨幣字符串實(shí)例代碼

    這篇文章主要介紹了Java把數(shù)字格式化為貨幣字符串實(shí)例代碼,需要的朋友可以參考下
    2014-02-02
  • JAVA使用POI(XSSFWORKBOOK)讀取EXCEL文件過(guò)程解析

    JAVA使用POI(XSSFWORKBOOK)讀取EXCEL文件過(guò)程解析

    這篇文章主要介紹了JAVA使用POI(XSSFWORKBOOK)讀取EXCEL文件過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • java8中:: 用法示例(JDK8雙冒號(hào)用法)

    java8中:: 用法示例(JDK8雙冒號(hào)用法)

    這篇文章主要給大家介紹了關(guān)于java8 中的:: 用法(JDK8雙冒號(hào)用法)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java8具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Spring Boot接口冪等插件用法示例解析

    Spring Boot接口冪等插件用法示例解析

    這篇文章主要介紹了Spring Boot接口冪等插件用法示例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • 淺談hibernate中對(duì)象的3種狀態(tài)_瞬時(shí)態(tài)、持久態(tài)、脫管態(tài)

    淺談hibernate中對(duì)象的3種狀態(tài)_瞬時(shí)態(tài)、持久態(tài)、脫管態(tài)

    下面小編就為大家?guī)?lái)一篇淺談hibernate中對(duì)象的3種狀態(tài)_瞬時(shí)態(tài)、持久態(tài)、脫管態(tài)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • Java中break、continue、return在for循環(huán)中的使用

    Java中break、continue、return在for循環(huán)中的使用

    這篇文章主要介紹了break、continue、return在for循環(huán)中的使用,本文是小編收藏整理的,非常具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-11-11
  • 關(guān)于Jedis的用法以及Jedis使用Redis事務(wù)

    關(guān)于Jedis的用法以及Jedis使用Redis事務(wù)

    這篇文章主要介紹了關(guān)于Jedis的用法以及Jedis使用Redis事務(wù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03

最新評(píng)論