Java重溫學習筆記,Java5新特性
1.泛型(Generic)
泛型提供編譯時型別安全檢測機制,該機制允許程式設計師在編譯時檢測到非法型別。泛型的本質是引數化型別,也就是說所操作的資料型別被指定為一個引數。
一個泛型的基本應用:
import java.util.*; public class MyDemo { public static void main(String[] args) { // 泛型最基本的應用,保證放到集合中的元素都是正確的型別 List<String> strList = new ArrayList<String>(); strList.add("this is string1"); strList.add("this is string2"); // 下面這行會出現編譯錯誤,因為加入的物件不是String型別 //strList.add(12345);
// Java5 之前,對List的遍歷方式 for (int n=0; n<strList.size(); n++) { System.out.println(strList.get(n)); } // Java5 之後,可以用如下方法對List進行遍歷 for (String str: strList) { System.out.println(str); } } }
更多泛型閱讀,參考:
Java重溫學習筆記,關於泛型
Java重溫學習筆記,泛型萬用字元
2.For-Each迴圈
For-Each迴圈得加入,大大簡化集合的遍歷。參考如下程式碼:
import java.util.*; public class MyDemo { public static void main(String[] args) { // 泛型最基本的應用,保證放到集合中的元素都是正確的型別 List<String> strList = new ArrayList<String>(); strList.add("this is string1"); strList.add("this is string2"); // Java5 之後可以用如下方法對List進行遍歷 for (String str: strList) { System.out.println(str); } } }
對上述程式碼生成的class檔案進行反編譯,結果如下:
import java.io.PrintStream; import java.util.*; public class MyDemo { public MyDemo() { } public static void main(String args[]) { ArrayList arraylist = new ArrayList(); arraylist.add("this is string1"); arraylist.add("this is string2"); String s; for(Iterator iterator = arraylist.iterator(); iterator.hasNext(); System.out.println(s)) s = (String)iterator.next(); } }
3.自動裝箱/拆箱(Autoboxing/unboxing)
裝箱就是primitive型別轉成對應的wrapper型別,拆箱就是反過來。毫無疑問,自動裝箱/拆箱大大簡化基本資料型別和它們包裝類的使用。
參考如下程式碼:
import java.util.*; public class MyDemo { public static void main(String args[]) { // 自動裝箱 Integer score = 53; System.out.println(score); // 自動拆箱 int newScore = score + 7; System.out.println(newScore); } }
對上述程式碼生成的class檔案進行反編譯,結果如下:
import java.io.PrintStream; public class MyDemo { public MyDemo() { } public static void main(String args[]) { Integer integer = Integer.valueOf(53); System.out.println(integer); int i = integer.intValue() + 7; System.out.println(i); } }
從反編譯後的程式碼可以看出,自動裝箱就是編譯器幫我們呼叫了valueOf方法,自動拆箱就是幫我們呼叫了intValue方法。
4.列舉(Enums)
請看下面的程式碼:
import java.io.PrintStream; enum Color { Red, White, Blue } public class MyDemo { public static void main(String args[]) { Color myColor = Color.Red; switch (myColor) { case Red: System.out.println("Red"); break; case White: System.out.println("White"); break; case Blue: System.out.println("Blue"); break; } // 對列舉類遍歷 for (Color c : Color.values()) System.out.println(c); } }
更多列舉閱讀,參考:
Java重溫學習筆記,迭代列舉元素
5.可變引數(Varargs)
請看下面的程式碼:
import java.io.PrintStream; public class MyDemo { // 不可以定義如下同名方法,因為int... myValue,其實等同於int[] myValue。否則出現編譯錯誤: // 錯誤: 無法在MyDemo中同時宣告sumValue(int...)和sumValue(int[]) //public static int sumValue(int[] myValue) { //} public static int sumValue(int... myValue) { int result = 0; for (int i = 0; i < myValue.length; i++) { result += myValue[i]; // 從這兒也可以看出,myValue其實是一個數組。 } return result; } public static void main(String args[]) { System.out.println(sumValue(1, 2, 3)); System.out.println(sumValue(1, 2, 3, 4)); } }
6.靜態匯入(Static Imports)
以前,使用其它類包的靜態方法或變數,我們必須給出提供這個方法的類。使用靜態匯入可以使之簡化。以前的方法:
public class MyDemo { public static void main(String args[]) { System.out.println(Math.max(2, 5)); System.out.println(Math.PI); } }
現在的方法:
import static java.lang.Math.PI; import static java.lang.Math.max; public class MyDemo { public static void main(String args[]) { System.out.println(max(2, 5)); System.out.println(PI); } }
說實話,本人不贊成使用靜態匯入,因為它使程式碼的可讀性降低。
7.元資料(Annotations)
註解(也被稱為元資料):為我們在程式碼中新增資訊提供了一種形式化的方法,使我們可以在稍後某個時刻非常方便的使用這些資料。
javaSE內建了3種標準註解:
a. @SuppressWarnings
該註解的作用是阻止編譯器發出某些警告資訊。
它可以有以下引數:
deprecation :過時的類或方法警告。
unchecked:執行了未檢查的轉換時警告。
fallthrough:當Switch程式塊直接通往下一種情況而沒有Break時的警告。
path:在類路徑、原始檔路徑等中有不存在的路徑時的警告。
serial:當在可序列化的類上缺少serialVersionUID定義時的警告。
finally:任何finally子句不能完成時的警告。
all:關於以上所有情況的警告。
b.@Deprecated
該註解的作用是標記某個過時的類或方法。
c. @Override
該註解用在方法前面,用來標識該方法是重寫父類的某個方法。
本文參考:
https://www.cnblogs.com/strongmore/p/13282777.html
https://www.cnblogs.com/jtlgb/p/6366087.html