1. 程式人生 > 其它 >Java重溫學習筆記,Java5新特性

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