自動裝箱和拆箱
自動裝箱是Java編譯器在基元類型和相應(yīng)的對象包裝類之間進行的自動轉(zhuǎn)換,例如,將int轉(zhuǎn)換為Integer,將double轉(zhuǎn)換為Double,依此類推,如果轉(zhuǎn)換是另一種方式,則稱為拆箱。
以下是自動裝箱的最簡單示例:
Character ch = "a";
本節(jié)中的其余示例使用泛型,如果您還不熟悉泛型的語法,請參閱泛型課程。
考慮以下代碼:
Listli = new ArrayList<>(); for (int i = 1; i < 50; i += 2) li.add(i);
雖然你將int值作為基本類型而不是Integer對象添加到li,但代碼會進行編譯,因為li是Integer對象的列表,而不是int值列表,你可能想知道為什么Java編譯器不會發(fā)出編譯時錯誤,編譯器不會生成錯誤,因為它從i創(chuàng)建一個Integer對象并將該對象添加到li,因此,編譯器在運行時將前面的代碼轉(zhuǎn)換為以下代碼:
Listli = new ArrayList<>(); for (int i = 1; i < 50; i += 2) li.add(Integer.valueOf(i));
將原始值(例如int)轉(zhuǎn)換為相應(yīng)包裝類(Integer)的對象稱為自動裝箱,Java編譯器應(yī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; }
因為余數(shù)(%)和一元加號(+=)運算符不適用于Integer對象,你可能想知道為什么Java編譯器編譯該方法而不發(fā)出任何錯誤,編譯器不會生成錯誤是因為它在運行時調(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
自動裝箱和拆箱使開發(fā)人員可以編寫更清晰的代碼,使其更易于閱讀,下表列出了原始類型及其相應(yīng)的包裝類,Java編譯器使用這些類進行自動裝箱和拆箱:
原始類型 | 包裝類 |
---|---|
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://www.ezyhdfw.cn/yun/72903.html
摘要:對象頭的另外一部分是類型指針,即對象指向它的類元數(shù)據(jù)的指針,虛擬機通過這個指針來確定這個對象是哪個類的實例。并不是所有的虛擬機實現(xiàn)都必須在對象數(shù)據(jù)上保留類型指針,換句話說,查找對象的元數(shù)據(jù)信息并不一定要經(jīng)過對象本身,這點將在節(jié)討論。 目錄介紹 1.關(guān)于int和Integer的問題區(qū)別分析 2.Integer的值緩存的原理 2.1 Java 5 中引入緩存特性 2.2 Intege...
字符 大多數(shù)情況下,如果使用單個字符值,則將使用原始char類型,例如: char ch = a; // Unicode for uppercase Greek omega character char uniChar = u03A9; // an array of chars char[] charArray = { a, b, c, d, e }; 但是,有時候需要使用字符作為對象 — 例如...
摘要:本章部分內(nèi)容從源碼中解讀一些自動裝箱與拆箱的原理,以及會出現(xiàn)的一些陷阱已經(jīng)性能等。例題分析我們通過幾個經(jīng)典的問題,來看看大家到底理解了裝箱與拆箱的知識點沒。 showImg(https://img-blog.csdnimg.cn/20190426221838971.gif);showImg(https://img-blog.csdnimg.cn/20190426221918208.pn...
摘要:本文主要介紹了中的函數(shù)與原語,由國內(nèi)管理平臺編譯呈現(xiàn)。原語與對象語言毫無關(guān)系。對象函數(shù)有個方法叫,返回數(shù)字化原語的方法被稱為,或。你可以創(chuàng)建函數(shù)的特殊形式,使用原語,而不是對象。 【編者按】本文作者為專注于自然語言處理多年的 Pierre-Yves Saumont,Pierre-Yves 著有30多本主講 Java 軟件開發(fā)的書籍,自2008開始供職于 Alcatel-Lucent 公...
閱讀 2877·2021-10-08 10:04
閱讀 3356·2021-09-10 11:20
閱讀 576·2019-08-30 10:54
閱讀 3407·2019-08-29 17:25
閱讀 2358·2019-08-29 16:24
閱讀 954·2019-08-29 12:26
閱讀 1524·2019-08-23 18:35
閱讀 2050·2019-08-23 17:53