前幾次課的講解,我們了解了這樣幾個問題。Java的兩種數據類型,和一些程序控制語句。今天,我們還是要通過一些例子。對上述東西有一個更深的理解。
我們現在知道了,所有對象型的數據類型的基類是java.lang.Object 。而寫java程序的時候非常多的工作都是在寫這些類,和實現里面的方法。而偏偏就有那么8種基本類型和他們不一樣。以至于讓你來回在這兩種之間轉換,這是很讓人頭疼的事情。Java中int,long,char這樣的類型不是對象型。因此java里提供了一種叫做包裝類(wrapper)的東西,使基本類型,有著相應的對象類型Integer,Long,Character等。這樣就可以,先把基本類型的東西,轉成對象來用,然后再轉回去。來來回回,千錘百煉。
到了jdk5.0的時候呢,就不用了。看下面的例子: 實踐:
public class Test1 {
public static void main(String[] args) {
// 裝箱
int i = 0;
Integer integer = i;//i這么一個基本類型的數,可以賦值給Integer型的變量
// 簡單的拆箱
int j = integer; //integer這種原始類型的數,也能賦值給j這個原始類型的變量
Integer counter = 1; // 裝箱
int counter2 = counter; // 拆箱
while (counter < 100) {
System.out.println("計數 "+counter++); //看啊,counter這個對象型的數,還能自動增加
}
}
}
在幕后JVM已經自動執行了轉換,同理Boolean和boolean之間也可以,自動拆箱裝箱。但是,Integer和int畢竟還是有著不同的。看下面例子:
public class Test2 {
public static void main(String[] args) {
Integer i1 = 256;
Integer i2 = 256;
if (i1 = = i2)
System.out.println("相等!");
else
System.out.println("不相等!");
}
} 結果輸出的是“不相等!”,兩個對象比較,它們在內存中開辟的是兩個地址怎么能相等呢?
警告:你可千萬不能依賴這個結果,請把i1和i2的值,改成100。(請看Test3.java)看看什么結果,令人驚訝的是改了個數,居然輸出了“相等!”。
這是因為JVM可以選擇要嘗試這段代碼的最佳優化,并對兩個Integer對象使用一個實例,這樣的話“= =”就會返回true了。在自動裝箱時對于值從–128到127之間的值,使用一個實例。上述例子打包下載
這種裝箱與拆箱機制對,程序流程控制語句,也有很大影響:
public class Test4 {
public static void main(String[] args) {
Boolean arriving = true;
Integer peopleInRoom = 0;
int maxCapacity = 100;
while (peopleInRoom < maxCapacity) {
if (arriving) {
System.out.printf("很高興見到你.%d號先生\n",peopleInRoom);
peopleInRoom++;}
else {
peopleInRoom--;
}
}}}另外一個從unboxing獲得好處的語句是switch。在jdk5.0之前的JVM,switch接受int、short、character或者byte值,而在unboxing的操作中,你現在也可以為它賦予新引入的enum之外的Integer,Short,Char以及Byte值。Enum的值,我們在后面的教程會詳細講述。上述例子打包下載