1. 程式人生 > >javaSE新特性概述

javaSE新特性概述

註解(Annotation)

Annotation可以說是JDK發展的重要技術,從現在的開發來講,Annotation的使用已經變得非常常見。

JDK三個內建註解

1. @Override 準確覆寫

當子類覆寫父類方法時,此註解檢查覆寫的方法是否正確宣告,只有滿足覆寫方法要求才會編譯通過,否則編譯出錯。

2. @Deprecated 過期宣告

建議使用者不使用原有的類&方法時,可以在類或方法上@Deprecated表示在當前版本中不推薦使用 eg:觀察過期宣告

class Person {
    private String name;

    @Deprecated//表示該方法已經不建議使用了,但你使用了也不會出錯
public Person() {//不推薦使用的構造方法 System.out.println("*******"); } public Person(String name) { System.out.println("#########"); } } public class Test_11_6 { public static void main(String[] args) { Person per1 = new Person();//明確的標記出過期 Person per2 = new Person
("hello"); } }

3. @SuppressWarings 壓制警告

呼叫某些操作可能產生問題的時候會出現警告資訊,但是警告資訊並不是異常

常見的壓制警告關鍵字
deprecation   		使用了不贊成使用的類或方法時的警告 
unchecked     		執行了未檢查的轉換時的警告,例如當使用集合時沒有用泛型 (Generics)
		        來指定集合儲存的型別。
rawtypes                使用類時忽略沒有指定相應的型別		         
fallthrough   		當 Switch 程式塊直接通往下一種情況而沒有 Break 時的警告。 
path          		在類路徑、原始檔路徑等中有不存在的路徑時的警告。  
serial        		當在可序列化的類上缺少 serialVersionUID 定義時的警告。  
finally
任何 finally 子句不能正常完成時的警告。 all 關於以上所有情況的警告。

介面定義增強

JDK1.8之後介面允許出現以下兩種方法:

  1. 使用default定義的普通方法,需要通過介面物件來呼叫。
  2. 使用static定義的靜態方法,直接使用介面名呼叫。

eg:

/**
 * 介面定義增強
 */
interface ICompute {
    default void fun() {
        System.out.println("介面中的普通方法,需要通過介面物件來呼叫,並且不需要被覆寫");
    }
    static ICompute test() {
        System.out.println("介面中的靜態方法,直接通過介面呼叫,不需要被覆寫");
        return new Computer();
    }
    void print();//介面中的抽象方法
}

class Computer implements ICompute {
    @Override
    public void print() {
        System.out.println("覆寫了介面中的抽象方法");
    }
}

public class Test_11_7 {
    public static void main(String[] args) {
        ICompute iCompute = ICompute.test();
        System.out.println(iCompute);
        iCompute.fun();
        iCompute.print();
    }
}

Lambda表示式

  • Lambda是JDK1.8推出的重要新特性。很多開發語言都開始支援函數語言程式設計,其中最具備代表性的就是haskell。 函數語言程式設計和麵向物件程式設計可以理解為兩大開發陣營。很多人認為面向物件的概念過於完整,結構操作不明確。

  • 要想使用函數語言程式設計有一個前提:介面必須只有一個方法。 如果存在兩個以上的方法,無法使用函數語言程式設計。

  • 如果現在某個介面就是為了函數語言程式設計而生的,在定義時只能存在一個方法, 因此有一個新的註解@FunctionalInterface,此註解會檢查該介面中是否只存在 一個抽象方法,存在兩個抽象方法以上編譯報錯。

語法:
    方法體只有一行程式碼時:
    (方法引數) -> 具體的方法體實現
	
    當方法有返回值時,單行程式碼的Lambda表示式可以省略return語句。
    當方法體有多行程式碼時:
    (方法引數) -> {
        ....
        ....
        ....
        [return 語句];
    };

eg:

/**
 * Lambda表示式
 */
@FunctionalInterface//是一個函數語言程式設計介面,只允許有一個方法
interface IAdd {
    int add(int x, int y);//抽象方法
}

public class Test_11_7 {
    public static void main(String[] args) {
        IAdd iAdd = (p1, p2) -> {
            System.out.print("p1 + p2 = ");
            return(p1+p2);
        };
        System.out.println(iAdd.add(10,20));
    }
}

方法引用

從最初開始,只要是進行引用都是針對於引用型別完成的,也就是隻有陣列、類、介面具備引用操作。但是JDK1.8 開始追加了方法引用的概念。實際上引用的本質就是別名。所以方法的引用也是別名的使用。而方法引用的型別有 四種形式:

  1. 引用類中靜態方法 類名稱 :: 靜態方法名稱
/**1.
 * 引用String類的靜態方法將Integer轉化成String
 * @param <R> Integer類
 * @param <P> String類
 */
@FunctionalInterface
interface IUsb<R,P> {
    P switchPara(R r);//介面的抽象方法
}

public class Test_11_8 {
    public static void main(String[] args) {
        IUsb<Integer,String> iUsb = String :: valueOf;
        String str = iUsb.switchPara(1000);//相當於呼叫了String.valueOf(1000)
        System.out.println(str.length());
    }
}
  1. 引用某個物件的方法 例項化物件 :: 普通方法
/**2.
 * 引用物件的普通方法 (String類的toUpperCase方法為物件方法)
 * @param <T> 返回String類
 */
@FunctionalInterface//是一個函數語言程式設計介面,只允許有一個方法
interface IUsb<T> {
    T switchPara();
}

public class Test_11_8 {
    public static void main(String[] args) {
        IUsb<String> iUsb = "hello" :: toUpperCase;
        String str = iUsb.switchPara();
        System.out.println(str);
    }
}
  1. 引用類中普通方法 類名稱 :: 普通方法名`
/**3.
 * 引用類中的普通方法(String類的compareTo方法)
 * @param <T> 返回Integer型別
 * @param <R> 傳入兩個String類比較
 */
@FunctionalInterface// 是一個函數語言程式設計介面,只允許有一個方法
interface IUsb<T, R> {
    T switchPara(R r1, R r2);
}

public class Test_11_8 {
    public static void main(String[] args) {
        IUsb<Integer, String> iUsb = String :: compareTo;
        Integer integer = iUsb.switchPara("李","曹");
        System.out.println(integer);
    }
}
  1. 引用類中構造方法 類名稱 :: new
class Per {
    @SuppressWarnings("unused")
    private String name;
    @SuppressWarnings("unused")
    private Integer age;

    @SuppressWarnings("all")
    public Per(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "name:"+this.name+" "+"age:"+this.age;
    }
}


/**4.
 * 引用構造方法
 * @param <T> 返回類名
 * @param <Rp> String類
 * @param <Rn> Integer類
 */
@FunctionalInterface //是一個函數語言程式設計介面,只允許有一個方法
interface IPer<T, Rp, Rn> {
    T switchPara(Rp rp, Rn rn);
}

public class Test_11_8 {
    public static void main(String[] args) {
        IPer<Per, String, Integer> iPer = Per :: new;
        Per p = iPer.switchPara("李",18);
        System.out.println(p);
    }
}