Java™ 教程(自动装箱和拆箱)
自動(dòng)裝箱和拆箱
自動(dòng)裝箱是Java編譯器在基元類(lèi)型和相應(yīng)的對(duì)象包裝類(lèi)之間進(jìn)行的自動(dòng)轉(zhuǎn)換,例如,將int轉(zhuǎn)換為Integer,將double轉(zhuǎn)換為Double,依此類(lèi)推,如果轉(zhuǎn)換是另一種方式,則稱(chēng)為拆箱。
以下是自動(dòng)裝箱的最簡(jiǎn)單示例:
Character ch = 'a';本節(jié)中的其余示例使用泛型,如果您還不熟悉泛型的語(yǔ)法,請(qǐng)參閱泛型課程。
考慮以下代碼:
List<Integer> li = new ArrayList<>(); for (int i = 1; i < 50; i += 2)li.add(i);雖然你將int值作為基本類(lèi)型而不是Integer對(duì)象添加到li,但代碼會(huì)進(jìn)行編譯,因?yàn)閘i是Integer對(duì)象的列表,而不是int值列表,你可能想知道為什么Java編譯器不會(huì)發(fā)出編譯時(shí)錯(cuò)誤,編譯器不會(huì)生成錯(cuò)誤,因?yàn)樗鼜膇創(chuàng)建一個(gè)Integer對(duì)象并將該對(duì)象添加到li,因此,編譯器在運(yùn)行時(shí)將前面的代碼轉(zhuǎn)換為以下代碼:
List<Integer> li = new ArrayList<>(); for (int i = 1; i < 50; i += 2)li.add(Integer.valueOf(i));將原始值(例如int)轉(zhuǎn)換為相應(yīng)包裝類(lèi)(Integer)的對(duì)象稱(chēng)為自動(dòng)裝箱,Java編譯器應(yīng)用自動(dòng)裝箱,當(dāng)原始值是:
- 作為參數(shù)傳遞給期望相應(yīng)包裝類(lèi)的對(duì)象的方法。
- 分配給相應(yīng)包裝類(lèi)的變量。
考慮以下方法:
public static int sumEven(List<Integer> li) {int sum = 0;for (Integer i: li)if (i % 2 == 0)sum += i;return sum; }因?yàn)橛鄶?shù)(%)和一元加號(hào)(+=)運(yùn)算符不適用于Integer對(duì)象,你可能想知道為什么Java編譯器編譯該方法而不發(fā)出任何錯(cuò)誤,編譯器不會(huì)生成錯(cuò)誤是因?yàn)樗谶\(yùn)行時(shí)調(diào)用intValue方法將Integer轉(zhuǎn)換為int:
public static int sumEven(List<Integer> li) {int sum = 0;for (Integer i : li)if (i.intValue() % 2 == 0)sum += i.intValue();return sum; }將包裝類(lèi)型(Integer)的對(duì)象轉(zhuǎn)換為其對(duì)應(yīng)的原始(int)值稱(chēng)為拆箱,Java編譯器應(yīng)用拆箱,當(dāng)包裝類(lèi)的對(duì)象是:
- 作為參數(shù)傳遞給期望相應(yīng)基元類(lèi)型的值的方法。
- 分配給相應(yīng)基元類(lèi)型的變量。
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 invocationint absVal = absoluteValue(i);System.out.println("absolute value of " + i + " = " + absVal);List<Double> ld = new ArrayList<>();ld.add(3.1416); // Π is autoboxed through method invocation.// 2. Unboxing through assignmentdouble 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)裝箱和拆箱使開(kāi)發(fā)人員可以編寫(xiě)更清晰的代碼,使其更易于閱讀,下表列出了原始類(lèi)型及其相應(yīng)的包裝類(lèi),Java編譯器使用這些類(lèi)進(jìn)行自動(dòng)裝箱和拆箱:
| boolean | Boolean |
| byte | Byte |
| char | Character |
| float | Float |
| int | Integer |
| long | Long |
| short | Short |
| double | Double |
上一篇:StringBuilder類(lèi)
下一篇:為什么要使用泛型?
總結(jié)
以上是生活随笔為你收集整理的Java™ 教程(自动装箱和拆箱)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 一部手机可以对多个开发者账号开启双重认证
- 下一篇: CAP理论与分布式事务解决方案