javaSE新特性概述
阿新 • • 發佈:2018-12-20
註解(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之後介面允許出現以下兩種方法:
- 使用default定義的普通方法,需要通過介面物件來呼叫。
- 使用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.
* 引用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());
}
}
- 引用某個物件的方法 例項化物件 :: 普通方法
/**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);
}
}
- 引用類中普通方法 類名稱 :: 普通方法名`
/**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);
}
}
- 引用類中構造方法 類名稱 :: 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);
}
}