JDK 1.5 新特性學習筆記(1)

JDK 1.5/5.0在Java語言方面進行了許多加強。此文簡要描述每一新特性的基本內容,便於快速瞭解相關知識點,更詳細的描述請參考相關資料。app


1. 自動裝箱(Auto Boxing)spa

自動裝箱即在基本類型(Primitives)和對應的封裝類型(Wrapper Types)之間自動進行轉換。此特性主要是做爲一個語言易用性上的加強,聽起來很是簡單,但也有一些須要注意的小陷阱。code

下面是常見的使用場景,提供了相應的代碼示例,須要注意的地方在註釋中加以描述。對象


1.1 將基本類型轉換爲對應的封裝類型編譯器

這種屬於最基本的轉換,且比較容易理解,也沒有須要特別注意的地方。代碼示例:虛擬機

Byte b = (byte) 0;
Short sh = (short) 0;
Integer i = 0;
Long l = 0L;
Boolean bool = true;
Character ch = 'a';
Float f = 0.1f;
Double d = 0.1d;

 

1.2 將封裝類型轉換爲對應的基本類型it

這種也屬於最基本的轉換,須要注意對象爲null的狀況。代碼示例:io

Integer i = 0;
int j = i;
i = null;
j = i; // a NullPointerException is thrown at runtime

 

1.3 封裝類型上的自增(++)和自減(--)運算符編譯

封裝類型上也支持自增和自減運算。代碼示例:class

Integer i = 0;
i++;
i--;

 

1.4 布爾型

布爾的封裝類型(Boolean)也支持邏輯運算符。代碼示例:

Boolean case1 = true;
Boolean case2 = true;
boolean case3 = false;
Boolean result = !((case1 || case2) && case3);

 

1.5 三元運算符

三元運算符的使用上也有一些變化,邏輯表達式的值能夠是Boolean型,而且兩個表達式的結果能夠是相同基類的不一樣子類型,不須要強制類型轉換了。代碼示例:

int i = 0;
String s = "1";
Boolean b = true;
Object obj = b ? i : s;
System.out.println(obj); // the output is 0

 

1.6 ==運算符

既然封裝類型和基本類型之間能夠互相轉換,那麼就引出一個問題,兩個整數(基本類型和封裝類型)之間的判等如何處理?代碼示例

Integer i1 = 0;
Integer i2 = 0;
System.out.println(i1 == i2 ? "equal" : "not equal"); // equal
Integer i3 = new Integer(0);
Integer i4 = 0;
System.out.println(i3 == i4 ? "equal" : "not equal"); // not equal
int i5 = 0;
int i6 = new Integer(0);
System.out.println(i5 == i6 ? "equal" : "not equal"); // equal
Integer i7 = 128;
Integer i8 = 128;
System.out.println(i7 == i8 ? "equal" : "not equal"); // not equal

此處須要說明的是,-127~127範圍內的整數會被轉換成常量對象,所以==運算符返回true。

由於有和虛擬機實現相關的不肯定的因素在,因此對象之間的判等最好仍是使用equals方法,防止出現不可預料的結果。


1.7 方法重載的處理

爲與以前的JDK版本兼容,JDK 1.5中方法重載時的方法定位分三趟進行

第一趟:編譯器查找與方法調用一致的方法,不進行自動裝箱、變長參數處理(即JDK 1.4的方式,首先使用類型徹底匹配的,如沒有則使用參數爲基類類型的);

第二趟:若是第一趟定位失敗,則編譯器增長自動裝箱處理,再次定位;

第三趟:若是第二趟定位失敗,則編譯器增長自動裝箱和變長參數處理,最後一次定位。

代碼示例:

public static void main(String[] args) {
	/* method overloading */
	testOverloading(1); // the output is double
}
	
static void testOverloading(double d) {
	System.out.println("double");
}
	
static void testOverloading(Integer i) {
	System.out.println("Integer");
}
相關文章
相關標籤/搜索