一、枚舉
1.基本介紹
(1)枚舉對應英文 enumeration,簡寫為 enum
(2)枚舉是一組常量的集合
(3)可以理解為:枚舉屬于一種特殊的類,里面只包含一組有限的特定的對象
2.實現方式
(1)自定義類實現枚舉
1)步驟
1.不需要提供setXxx方法,因為枚舉對象的值通常為只讀
2.對枚舉對象/屬性使用 final+static共同修飾,實現底層優化
3.枚舉對象名通常使用全部大寫,遵循敞亮的命名規范
4.枚舉對象根據需要也可以有多個屬性
package com.figiting.enum_;/*** @version 1.0* @autor 瘋小丟*/
public class Enumeration01 {public static void main(String[] args) {System.out.println(Season.SPRING);System.out.println(Season.SUMMER);System.out.println(Season.AUTUMN);System.out.println(Season.WINNER);}
}class Season{private String name;private String desc;//定義了四個對象public static final Season SPRING = new Season("春天","溫暖");public static final Season SUMMER = new Season("夏天","炎熱");public static final Season AUTUMN = new Season("秋天","涼爽");public static final Season WINNER = new Season("冬天","寒冷");//1.構造器私有化,防止直接new//3.在Season內部,直接創建固定對象//4.優化,可以加入final修飾符private Season(String name, String desc) {this.name = name;this.desc = desc;}public String getName() {return name;}//2.去掉set相關方法,只讀不修改,防止屬性被修改/*public void setName(String name) {this.name = name;}*/public String getDesc() {return desc;}@Overridepublic String toString() {return "Season{" +"name='" + name + '\'' +", desc='" + desc + '\'' +'}';}/*public void setDesc(String desc) {this.desc = desc;}*/
}
2)特點
1.構造器私有化
2.本類內部創建一組對象
3.對外暴露對象(通過為對象添加public final static修飾符)
4.可以提供get方法,但是不要提供set
(2)使用enum關鍵字
package com.figiting.enum_;/*** @version 1.0* @autor 瘋小丟*/
public class Enumeration02 {public static void main(String[] args) {//使用Season2枚舉類演示方法Season2 autumn = Season2.AUTUMN;//輸出枚舉對象的名稱System.out.println(autumn.name());//輸出該枚舉對象的次序/編號,從0開始編號System.out.println(autumn.ordinal());//values()返回枚舉對象,Season[]Season2[] values = Season2.values();for(Season2 season : values){//增強for循環//依次從數組中取出System.out.println(season);}//valueOf():將字符串轉換成枚舉對象,要求字符串必須為已有的常量名,否則報異常//執行流程//1.根據輸入的“AUTUMN"到Season2的枚舉對象去查找//2.如果找到了就返回,沒有就報錯Season2 autumn1 = Season2.valueOf("AUTUMN");System.out.println("autumn1=" + autumn1);System.out.println(autumn == autumn1);//compareTo:比較兩個枚舉常量,比較的就是編號//1.把Season2.AUTUMN枚舉對象的編號和Season2.SPRING枚舉對象的編號進行比較//2.結果 兩編號相減System.out.println(Season2.AUTUMN.compareTo(Season2.SPRING));}
}enum Season2{//1.使用關鍵字eum來實現枚舉類//2.public static final Season SPRING = new Season("春天","溫暖");// SPRING("春天","溫暖");即常量名(實參列表)//3.如果有多個常量(對象).使用,號間隔即可//4.如果使用enum實現枚舉,要求將定義常量對象寫在前面,枚舉對象必須放在枚舉類的行首//5.如果使用的是無參構造器創建常量對象則可以使用What,可以省略()SPRING("春天","溫暖"),AUTUMN("秋天","涼爽");//SUMMER("夏天","炎熱"), What();//調用無參構造器,或Whatprivate String name;private String desc;//定義了四個對象
/* public static final Season SPRING = new Season("春天","溫暖");public static final Season SUMMER = new Season("夏天","炎熱");public static final Season AUTUMN = new Season("秋天","涼爽");public static final Season WINNER = new Season("冬天","寒冷");*/private Season2() {}private Season2(String name, String desc) {this.name = name;this.desc = desc;}public String getName() {return name;}//2.去掉set相關方法,只讀不修改,防止屬性被修改/*public void setName(String name) {this.name = name;}*/public String getDesc() {return desc;}@Overridepublic String toString() {return "Season{" +"name='" + name + '\'' +", desc='" + desc + '\'' +'}';}/*public void setDesc(String desc) {this.desc = desc;}*/
}
1)說明
1.當使用enum關鍵字開發一個枚舉類時,默認會繼承Enum類
2.將傳統的
public static final Season SPRING = new Season("春天","溫暖");? 簡化成?
SPRING("春天","溫暖");? 這里必須知道調用的是哪個構造器
3.如果使用無參構造器創建枚舉對象時,則實參列表和小括號都可以省略
4.當有多個枚舉對象時,使用,號間隔,最后一個分號結尾
5.枚舉對象必須放在枚舉類的行首
2)enum常用方法的使用
1.toString:Enum類已經重寫過,返回的是當前對象名,子類可以重寫該方法,用于返回對象的屬性信息
2.name:返回當前對象名(常量名),子類中不能重寫
3.ordinal:返回當前對象的位置號,默認從0開始
4.values:返回當前枚舉類中所有的常量
5.valueOf:將字符串轉換成枚舉對象,要求字符串必須為已有的常量名,否則報異常
6.compareTo:比較兩個枚舉常量,比較的是編號
public class Enumeration02 {public static void main(String[] args) {//使用Season2枚舉類演示方法Season2 autumn = Season2.AUTUMN;//輸出枚舉對象的名稱System.out.println(autumn.name());//輸出該枚舉對象的次序/編號,從0開始編號System.out.println(autumn.ordinal());//values()返回枚舉對象,Season[]Season2[] values = Season2.values();for(Season2 season : values){//增強for循環//依次從數組中取出System.out.println(season);}//valueOf():將字符串轉換成枚舉對象,要求字符串必須為已有的常量名,否則報異常//執行流程//1.根據輸入的“AUTUMN"到Season2的枚舉對象去查找//2.如果找到了就返回,沒有就報錯Season2 autumn1 = Season2.valueOf("AUTUMN");System.out.println("autumn1=" + autumn1);System.out.println(autumn == autumn1);//compareTo:比較兩個枚舉常量,比較的就是編號//1.把Season2.AUTUMN枚舉對象的編號和Season2.SPRING枚舉對象的編號進行比較//2.結果 兩編號相減System.out.println(Season2.AUTUMN.compareTo(Season2.SPRING));}
}
3.使用細節
(1)使用enum關鍵字后,就不能再繼承其他類了,因為enum會隱式繼承Enum,而Java是單繼承機制
(2)枚舉類和普通類一樣,可以實現接口,形式如下:
enum 類名 implements 接口1,接口2{}
package com.figiting.enum_;/*** @version 1.0* @autor 瘋小丟*/
public class EnumDetail {public static void main(String[] args) {Music.CLASSICMUSIC.playing();}
}class A {}
//1.使用enum關鍵字后就不能再繼承其它類,因為enum會隱式繼承Enum,而Java是單繼承機制
//enum Season3 extends A {
//
//}
//2.enum實現的枚舉類仍然是一個類,所以還是可以實現接口
interface IPlaying {public void playing();
}enum Music implements IPlaying {CLASSICMUSIC;public void playing(){System.out.println("播放好聽的音樂...");}
}
二、注解
1.初步理解
(1)注解(Annotation)也被稱為元數據(Metadata),用于修飾解釋 包、類、方法、屬性、構造器、局部變量等數據信息
(2)和注釋一樣,注解不影響程序邏輯,但注解可以被編譯或運行,相當于嵌入在代碼中的補充信息
(3)在JavaSE中,注解的使用目的比較簡單,例如標記過的時的功能,忽略警告等,在JavaEE中注解占據更重要的角色,例如用來配置應用程序的任何切面,代替JavaEE舊版中所遺留的繁冗代碼和XML配置等
2.基本介紹
使用Annotation時要在其前面增加 @符號,并把該Annotation當成一個修飾符使用,用于修飾它支持的程序元素
3.基本的Annotation應用案例
(1)@Override
限定某個方法,重寫父類方法,該注解只能用于方法
使用說明:
package com.figiting.annotation_;/*** @version 1.0* @autor 瘋小丟*/
public class Override {public static void main(String[] args) {}
}class Father{public void fly() {System.out.println("Father fly...");}
}class Son extends Father{//1. @Override注解放在fly方法上,表示子類fly方法重寫了父類的fly//2. 這里如果沒有寫@Override,還是重寫了父類的fly//3. 如果寫了,編譯器就會檢查該方法是否真的重寫了父類的方法//如果重寫了則編譯通過,如果沒有構成重寫,則編譯錯誤//即進行語法校驗//4.@Override定義,@interface表示注解類//public @interface Override {//}@java.lang.Overridepublic void fly() {System.out.println("Son fly...");}
}
1)@Override 表示制定重寫父類的方法,如果父類沒有fly方法,則不會報錯
2)如果不寫@Override注解,而父類仍有public void fly(){},仍然構成重寫
3)如果寫了,編譯器就會檢查該方法是否真的重寫了父類的方法,如果重寫了則編譯通過,如果沒有構成重寫,則編譯錯誤。即進行語法檢驗
4)@Override只能修飾方法,不能修飾其他類,包,屬性等
5)注解源碼:
(2)@Deprecated
用于表示某個程序元素(類,方法等)已過時
package com.figiting.annotation_;/*** @version 1.0* @autor 瘋小丟*/
public class Deprecated_ {public static void main(String[] args) {A a = new A();a.hi();System.out.println(a.n1);}
}//1.@Deprecated 修飾某個元素,表示該元素已經過時
//2.即不再推薦使用,但是仍然可以使用
//3.@Deprecated類的源碼
//4.可以修飾方法、類、字段、包、參數等
//5.可以做版本升級過度使用
@Deprecated
class A {public int n1 = 10;public void hi(){}
}
注解源碼:
(3)@SuppressWarnings
抑制編譯器警告
package com.figiting.annotation_;import java.util.ArrayList;
import java.util.List;/*** @version 1.0* @autor 瘋小丟*/
public class SuppressWarnings_ {//1.當我們不希望看到這些警告時,可以使用SuppressWarnings注解來抑制警告信息//2.在{"all"}中,可以寫入希望抑制(不顯示)的警告信息//3//4.關于SuppressWarnings作用范圍和放置的位置有關//比如@SuppressWarnings放置在main方法,則抑制警告范圍就是main//5.源碼//(1)放置的位置就是 TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE//(2)該注解類有數組String[] value();設置一個數組,比如{"rawtypes","unchecked","unused"}@SuppressWarnings({"rawtypes","unchecked","unused"})public static void main(String[] args) {List list = new ArrayList();list.add("");list.add("");list.add("");int i;System.out.println(list.get(1));}
}
可以指定的警告類型
1.all,抑制所有警告
2.cast,抑制與強制轉型作業相關的警告
3.dep-ann,抑制與淘汰注釋相關的警告
4.deprecation,抑制與淘汰相關警告
5.fallthrough,抑制與switch陳述式中遺漏break相關的警告
6.finally,抑制與未傳回finally區塊相關的警告
7.hiding,抑制2與隱藏變數的區域變數相關的警告
8.incomplete-switch,抑制與switch陳述式(enum case)中遺漏項目相關的警告
9.javadoc,抑制與javadoc相關的警告
10.nls,抑制與非nls字串文字相關的警告
11.rawtypes,抑制與使用raw類型相關的警告
12.resource,抑制與使用Closeable類型的資源相關的警告
13.restriction,抑制與使用不建議或禁止參照相關的警告
14.serial,抑制與可序化的類別遺漏serialVersionUID欄位相關的警告
15.static-access,抑制與靜態存取不正確相關的1警告
16.static-method,抑制與可宣告為static的方法相關的警告
17.super,抑制與置換方法相關但不含super呼叫的警告
18.synthetic-access,抑制與內部類別的存取未最佳化相關的警告
19.sync-override,抑制因為置換同步方法而遺漏同步化的警告
20.unchecked,抑制與未檢查的作業相關的警告
21.unqualified-field-access,抑制與欄位存取不合格相關的警告
22.unused,抑制與未用的程式碼及停用的程式碼相關的警告
生成@SupperssWarnings時直接點擊左側的黃色提示就可以選擇,注意可以指定生成的位置
4.元注解
(1)基本介紹
JDK的元注解用于修飾其他Annotation
元注解本身作用不大,但要清楚它是干什么的
(2)種類
1)@Retention 注解
1.說明
只能用于修飾一個Annotation定義,用于指定該Annotation 可以保留多長時間,
@Rentention包含一個RetentionPolicy類型的成員變量,使用@Rentention
時必須為該value成員變量指定值
2.@Retention的三種值
1)RetentionPolicy.SOURCE:編譯器使用后,直接丟棄這種策略的注釋
2) RetentionPolicy.CLASS:編譯器將把注釋記錄在class文件中,當運行Java程
序時,JVM不會保留注解。這是默認值
3)RetentionPolicy.RUNTIME:編譯器將把注釋記錄在class文件中,當運行
Java程序時,JVM會保留注釋.程序可以通過反射獲取該注釋
2)@Target
基本說明
用于修飾Annotation定義,用于指定被修飾的Annotation能用于修飾哪
些程序元素.@Target 也包含一個名為value的成員變量。
3)@Documented
基本說明
@Documented:用于指定被該元 Annotationi修飾的 Annotation類將被
javadoc 工具提取成文檔,即在生成文檔時,可以看到該注釋。
說明:定義為Documented的注解必須設置Retention值為RUNTIME。
4)@Inherited
基本說明
被它修飾的Annotation將具有繼承性,如果某個類使用了被@Inherited修飾
的Annotation,則其子類將自動具有該注解