java學習筆記(十)-- java新特性 (列舉 & 註解 & 介面定義加強 & Lambda表示式)
列舉 (enum)
高階的多例模式
java中列舉使用enum關鍵字定義列舉
列舉就是一種多例設計模式
enmu Color{
RED,BLUE,GREEN;
}
enum Color{
RED,BULE,GREEN;
}
public class Test {
public static void main(String[] args) {
System.out.println(Color.GREEN);
}
}
1 . 列舉類(Enum類)
JDK 1.5 新增的enum列舉結構並不是新的結構。
使用enum定義的列舉本質上是一個類,預設繼承java.lang.Enum父類。
取得列舉名稱:
public fianl String name()
取得列舉編號:
public final int ordinal()
取得所有列舉物件(靜態方法)
列舉類.values(): Enum[]
enum Color{ RED,BULE,GREEN; } public class Test { public static void main(String[] args) { System.out.println(Color.GREEN); System.out.println(Color.GREEN.ordinal()+"="+Color.GREEN.name()); for(Color temp:Color.values()){ System.out.println(temp.ordinal()+"="+temp.name()); } } }
面試:請解釋enum與Enum區別:
enum是一個關鍵字,使用enum定義的列舉類本質上就相對於一個類繼承了Enum這個抽象類而已。
2 . 列舉中定義其他結構,列舉物件必須放在首行宣告(語法要求)
構造方法使用private修飾私有化(相當於多例模式,構造方法必須私有化,)
enum Color{ RED("紅色"),BULE("藍色"),GREEN("綠色"); private String title; private Color(String title){ this.title=title; } @Override public String toString() { return this.title; } } public class Test { public static void main(String[] args) { System.out.println(Color.GREEN); } }
列舉可以實現介面,此時列舉中的每個物件都成為介面物件;
interface IColor{
public String getColor();
}
enum Color implements IColor{
RED("紅色"),BULE("藍色"),GREEN("綠色");
private String title;
private Color(String title){
this.title=title;
}
@Override
public String toString() {
return this.title;
}
@Override
public String getColor() {
return this.title;
}
}
public class Test {
public static void main(String[] args) {
IColor iColor=Color.GREEN;
System.out.println(iColor.getColor());
}
}
註解(Annotation)
1 . 準確覆寫(@Override)
檢查當前類中的覆寫方法與父類定義的方法是否相同,如果有任何一個地方不相同,編譯報錯
2 . 宣告過期處理(@Deprecated)
原有類或者方法在舊版本沒有問題,但是在新版本不推薦使用,可以加上@Deprecated註釋,明確表示不建議使用者使用此類,方法
package www.Dyson.java;
class Person{
@Deprecated //表明該方法已經不建議使用,但是使用了也並不會出錯
public Person(){};
public Person(String name){};
}
public class Test {
public static void main(String[] args) {
Person per1=new Person(); //標記處過期方法
Person per2=new Person("Dyson");
}
}
3 . 壓制警告(@SuppressWarnings)
當呼叫某些操作可能產生問題的時候就會產生警告資訊,警告資訊並不是異常(Exception)
使用之前:
使用之後:
JDK1.8介面定義加強(瞭解)
JDK1.8開始介面允許出現以下兩種方法
1 . 可以使用default來定義普通方法,需要同過物件來呼叫
2 . 可以使用static來定義靜態方法,同過介面名就可以定義
package www.Dyson.java;
interface IMessage{
//追加普通方法
public default void fun(){
System.out.println("Hello IMessage");
}
//定義一靜態方法,由介面名稱直接呼叫
public static IMessage getInstance(){
return new MessageImpl();
}
public void print();
}
class MessageImpl implements IMessage{
@Override
public void print() {
System.out.println("Hello MessageImpl");
}
}
public class Test {
public static void main(String[] args) {
IMessage message=IMessage.getInstance();
System.out.println(message);
message.print();
message.fun();
}
}
函數語言程式設計 Lambda表示式
要是用函數語言程式設計有一個前提:介面必須有一個方法。如果介面中存在兩個以上的方法,無法使用函數語言程式設計!
如果現在某個介面為了函數語言程式設計而生,@FunctionalInterface定義在介面上,檢查此介面是否只存在一個方法
lambda表示式語法:
單行無返回值,單行有返回值:
()-> ... 方法程式碼;
多行有返回值:
()-> {
...
...
return 返回值語句;
};
範例:傳統面向物件開發
package www.Dyson.java;
interface IMessage{
public void print();
}
public class Test {
public static void main(String[] args) {
IMessage message=new IMessage(){ //匿名內部類
@Override
public void print(){ //必須編寫完整語法
System.out.println("Hello world");
}
};
message.print();
}
}
範例:函數語言程式設計
package www.Dyson.java;
interface IMessage{
public void print();
}
public class Test {
public static void main(String[] args) {
IMessage message=()-> System.out.println("Hello world");
message.print();
}
}