自動(dòng)裝箱和拆箱
自動(dòng)裝箱是Java編譯器在基元類型和相應(yīng)的對象包裝類之間進(jìn)行的自動(dòng)轉(zhuǎn)換,例如,將int轉(zhuǎn)換為Integer,將double轉(zhuǎn)換為Double,依此類推,如果轉(zhuǎn)換是另一種方式,則稱為拆箱。
以下是自動(dòng)裝箱的最簡單示例:
Character ch = "a";
本節(jié)中的其余示例使用泛型,如果您還不熟悉泛型的語法,請參閱泛型課程。
考慮以下代碼:
Listli = new ArrayList<>(); for (int i = 1; i < 50; i += 2) li.add(i);
雖然你將int值作為基本類型而不是Integer對象添加到li,但代碼會(huì)進(jìn)行編譯,因?yàn)?b>li是Integer對象的列表,而不是int值列表,你可能想知道為什么Java編譯器不會(huì)發(fā)出編譯時(shí)錯(cuò)誤,編譯器不會(huì)生成錯(cuò)誤,因?yàn)樗鼜?b>i創(chuàng)建一個(gè)Integer對象并將該對象添加到li,因此,編譯器在運(yùn)行時(shí)將前面的代碼轉(zhuǎn)換為以下代碼:
Listli = new ArrayList<>(); for (int i = 1; i < 50; i += 2) li.add(Integer.valueOf(i));
將原始值(例如int)轉(zhuǎn)換為相應(yīng)包裝類(Integer)的對象稱為自動(dòng)裝箱,Java編譯器應(yīng)用自動(dòng)裝箱,當(dāng)原始值是:
作為參數(shù)傳遞給期望相應(yīng)包裝類的對象的方法。
分配給相應(yīng)包裝類的變量。
考慮以下方法:
public static int sumEven(Listli) { int sum = 0; for (Integer i: li) if (i % 2 == 0) sum += i; return sum; }
因?yàn)橛鄶?shù)(%)和一元加號(hào)(+=)運(yùn)算符不適用于Integer對象,你可能想知道為什么Java編譯器編譯該方法而不發(fā)出任何錯(cuò)誤,編譯器不會(huì)生成錯(cuò)誤是因?yàn)樗谶\(yùn)行時(shí)調(diào)用intValue方法將Integer轉(zhuǎn)換為int:
public static int sumEven(Listli) { int sum = 0; for (Integer i : li) if (i.intValue() % 2 == 0) sum += i.intValue(); return sum; }
將包裝類型(Integer)的對象轉(zhuǎn)換為其對應(yīng)的原始(int)值稱為拆箱,Java編譯器應(yīng)用拆箱,當(dāng)包裝類的對象是:
作為參數(shù)傳遞給期望相應(yīng)基元類型的值的方法。
分配給相應(yīng)基元類型的變量。
Unboxing示例顯示了其工作原理:
import java.util.ArrayList; import java.util.List; public class Unboxing { public static void main(String[] args) { Integer i = new Integer(-8); // 1. Unboxing through method invocation int absVal = absoluteValue(i); System.out.println("absolute value of " + i + " = " + absVal); Listld = new ArrayList<>(); ld.add(3.1416); // Π is autoboxed through method invocation. // 2. Unboxing through assignment double pi = ld.get(0); System.out.println("pi = " + pi); } public static int absoluteValue(int i) { return (i < 0) ? -i : i; } }
該程序打印以下內(nèi)容:
absolute value of -8 = 8 pi = 3.1416
自動(dòng)裝箱和拆箱使開發(fā)人員可以編寫更清晰的代碼,使其更易于閱讀,下表列出了原始類型及其相應(yīng)的包裝類,Java編譯器使用這些類進(jìn)行自動(dòng)裝箱和拆箱:
原始類型 | 包裝類 |
---|---|
boolean | Boolean |
byte | Byte |
char | Character |
float | Float |
int | Integer |
long | Long |
short | Short |
double | Double |
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/72903.html
摘要:對象頭的另外一部分是類型指針,即對象指向它的類元數(shù)據(jù)的指針,虛擬機(jī)通過這個(gè)指針來確定這個(gè)對象是哪個(gè)類的實(shí)例。并不是所有的虛擬機(jī)實(shí)現(xiàn)都必須在對象數(shù)據(jù)上保留類型指針,換句話說,查找對象的元數(shù)據(jù)信息并不一定要經(jīng)過對象本身,這點(diǎn)將在節(jié)討論。 目錄介紹 1.關(guān)于int和Integer的問題區(qū)別分析 2.Integer的值緩存的原理 2.1 Java 5 中引入緩存特性 2.2 Intege...
字符 大多數(shù)情況下,如果使用單個(gè)字符值,則將使用原始char類型,例如: char ch = a; // Unicode for uppercase Greek omega character char uniChar = u03A9; // an array of chars char[] charArray = { a, b, c, d, e }; 但是,有時(shí)候需要使用字符作為對象 — 例如...
摘要:本章部分內(nèi)容從源碼中解讀一些自動(dòng)裝箱與拆箱的原理,以及會(huì)出現(xiàn)的一些陷阱已經(jīng)性能等。例題分析我們通過幾個(gè)經(jīng)典的問題,來看看大家到底理解了裝箱與拆箱的知識(shí)點(diǎn)沒。 showImg(https://img-blog.csdnimg.cn/20190426221838971.gif);showImg(https://img-blog.csdnimg.cn/20190426221918208.pn...
摘要:本文主要介紹了中的函數(shù)與原語,由國內(nèi)管理平臺(tái)編譯呈現(xiàn)。原語與對象語言毫無關(guān)系。對象函數(shù)有個(gè)方法叫,返回?cái)?shù)字化原語的方法被稱為,或。你可以創(chuàng)建函數(shù)的特殊形式,使用原語,而不是對象。 【編者按】本文作者為專注于自然語言處理多年的 Pierre-Yves Saumont,Pierre-Yves 著有30多本主講 Java 軟件開發(fā)的書籍,自2008開始供職于 Alcatel-Lucent 公...
閱讀 2820·2021-10-08 10:04
閱讀 3262·2021-09-10 11:20
閱讀 529·2019-08-30 10:54
閱讀 3319·2019-08-29 17:25
閱讀 2306·2019-08-29 16:24
閱讀 893·2019-08-29 12:26
閱讀 1451·2019-08-23 18:35
閱讀 1937·2019-08-23 17:53