
1. 枚舉類的使用
1.1 自定義枚舉類
枚舉類的概念與背景
當(dāng)類的對(duì)象只有有限個(gè),確定個(gè)時(shí),此類稱為枚舉類。當(dāng)需要定義一組常量時(shí),強(qiáng)烈建議使用枚舉類
- 星期:Monday(星期一)、......、Sunday(星期天)
- 性別:Man(男)、Woman(女)
- 季節(jié):Spring(春節(jié))......Winter(冬天)
JDK1.5之前需要自定義枚舉類,JDK1.5新增的enum關(guān)鍵字用于定義枚舉類。
若枚舉只有一個(gè)對(duì)象, 則可以作為一種單例模式的實(shí)現(xiàn)方式。
自定義創(chuàng)建一個(gè)枚舉類
public class SeasonTest {
public static void main(String[] args) {
Season season = Season.SPRING;
System.out.println(season.toString());//Season{seasonName='春天', seasonDecs='春暖花開'}
}
}
class Season{
//1.聲明Season對(duì)象的屬性:private final修飾
private final String seasonName;
private final String seasonDecs;
//2.私有化類的構(gòu)造器
private Season(String seasonName,String seasonDecs){
this.seasonName = seasonName;
this.seasonDecs = seasonDecs;
}
//3.提供當(dāng)前枚舉類的多個(gè)對(duì)象
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 WINTER = new Season("冬天","冰天雪地");
//4.其它訴求
public String getSeasonName() {
return seasonName;
}
public String getSeasonDecs() {
return seasonDecs;
}
@Override
public String toString() {
return "Season{" +
"seasonName='" + seasonName + '\'' +
", seasonDecs='" + seasonDecs + '\'' +
'}';
}
}
1.2 關(guān)鍵字enum定義枚舉類
使用關(guān)鍵字enum創(chuàng)建一個(gè)枚舉類
public class SeasonTest {
public static void main(String[] args) {
Season season = Season.SPRING;
//這是因?yàn)槊杜e類自動(dòng)繼承了java.long.Enum類,以及它的toString(),所以不會(huì)返回地址值
System.out.println(season);//SPRING
}
}
enum Season{
//1.首先提供當(dāng)前枚舉類的對(duì)象,省略了多個(gè)相同的關(guān)鍵字,多個(gè)對(duì)象之間用','隔開,用';'結(jié)束
SPRING("春天","春暖花開"),
SUMMER("夏天","夏日炎炎"),
AUTUMN("秋天","秋高氣爽"),
WINTER("冬天","冰天雪地");
//2.聲明Season對(duì)象的屬性:private final修飾
private final String seasonName;
private final String seasonDecs;
//3.私有化類的構(gòu)造器
private Season(String seasonName,String seasonDecs){
this.seasonName = seasonName;
this.seasonDecs = seasonDecs;
}
//4.其它訴求
public String getSeasonName() {
return seasonName;
}
public String getSeasonDecs() {
return seasonDecs;
}
}
1.3 Enum類的主要方法
三大主要方法
- values():返回枚舉類型的對(duì)象數(shù)組
- valueOf(String objName):返回枚舉類中對(duì)象名是objName的對(duì)象
- toString():返回當(dāng)前枚舉類對(duì)象常量的名稱
public class SeasonTest {
public static void main(String[] args) {
Season season = Season.SPRING;
//1.values():返回枚舉類型的對(duì)象數(shù)組
Season[] values = Season.values();
for(int i = 0;i < values.length;i++){
System.out.println(values[i]);//SPRING、SUMMER、AUTUMN、WINTER
}
//2.valueOf(String objName):返回枚舉類中對(duì)象名是0bjName的對(duì)象。
Season winter =Season.valueOf("WINTER");
System.out.println(winter);//WINTER
//3.toString():返回當(dāng)前枚舉類對(duì)象常量的名稱
System.out.println(season.toString());//SPRING
}
}
enum Season{
//1.首先提供當(dāng)前枚舉類的對(duì)象,省略了多個(gè)相同的關(guān)鍵字,多個(gè)對(duì)象之間用','隔開,用';'結(jié)束
SPRING("春天","春暖花開"),
SUMMER("夏天","夏日炎炎"),
AUTUMN("秋天","秋高氣爽"),
WINTER("冬天","冰天雪地");
//2.聲明Season對(duì)象的屬性:private final修飾
private final String seasonName;
private final String seasonDecs;
//3.私有化類的構(gòu)造器
private Season(String seasonName,String seasonDecs){
this.seasonName = seasonName;
this.seasonDecs = seasonDecs;
}
//4.其它訴求
public String getSeasonName() {
return seasonName;
}
public String getSeasonDecs() {
return seasonDecs;
}
}
其他方法

1.4 實(shí)現(xiàn)接口的枚舉類
- 實(shí)現(xiàn)接口,在enum中實(shí)現(xiàn)抽象方法,每個(gè)對(duì)象的抽象方法不同,這是一種正常情況
- 實(shí)現(xiàn)接口,讓枚舉類的對(duì)象分別實(shí)現(xiàn)抽象方法,每個(gè)對(duì)象的抽象方法不同
package first.knowlodge.code05;
public class SeasonTest {
public static void main(String[] args) {
Season[] values = Season.values();
for(int i = 0;i < values.length;i++){
values[i].show();
/*
這是一個(gè)春暖花開的春天
這是一個(gè)夏日炎炎的夏天
這是一個(gè)秋高氣爽的秋天
這是一個(gè)冰天雪地的冬天
*/
}
}
}
interface info{
void show();
}
enum Season implements info{
SPRING("春天","春暖花開"){
@Override
public void show() {
System.out.println("這是一個(gè)春暖花開的春天");
}
},
SUMMER("夏天","夏日炎炎"){
@Override
public void show() {
System.out.println("這是一個(gè)夏日炎炎的夏天");
}
},
AUTUMN("秋天","秋高氣爽"){
@Override
public void show() {
System.out.println("這是一個(gè)秋高氣爽的秋天");
}
},
WINTER("冬天","冰天雪地"){
@Override
public void show() {
System.out.println("這是一個(gè)冰天雪地的冬天");
}
};
private final String seasonName;
private final String seasonDecs;
private Season(String seasonName,String seasonDecs){
this.seasonName = seasonName;
this.seasonDecs = seasonDecs;
}
public String getSeasonName() {
return seasonName;
}
public String getSeasonDecs() {
return seasonDecs;
}
}
2. 注解的使用
2.1 注解概述
- 從JDK5.0開始, Java增加了對(duì)元數(shù)據(jù)的支持, 也就是Annotation(注解)。
- Annotation其實(shí)就是代碼里的特殊標(biāo)記,這些標(biāo)記可以在編譯, 類加載, 運(yùn)行時(shí)被讀取, 并執(zhí)行相應(yīng)的處理。
- Annotation可以像修飾符一樣被使用,可用于修飾包、類、構(gòu)造器、方法、成員變量、參數(shù)、局部變量的聲明。
- 在JavaSE中,注解的使用目的比較簡(jiǎn)單,在JavaEE/Android中注解占據(jù)了更重要的角色。
2.2 常見的Annotation示例
示例一:生成文檔相關(guān)的注解
- @author:標(biāo)明開發(fā)該類模塊的作者,多個(gè)作者之間使用,分割
- @version:標(biāo)明該類模塊的版本
- @see:參考轉(zhuǎn)向,也就是相關(guān)主題
- @since:從哪個(gè)版本開始增加的
- @param:對(duì)方法中某參數(shù)的說明,如果沒有參數(shù)就不能寫
- @return:對(duì)方法返回值的說明,如果方法的返回值類型是void就不能寫
- @exception:對(duì)方法可能拋出的異常進(jìn)行說明 ,如果方法沒有用throws顯式拋出的異常就不能寫其中
示例二:在編譯時(shí)進(jìn)行格式檢查(JDK內(nèi)置的三個(gè)基本注解)
- @Override: 限定重寫父類方法, 該注解只能用于方法
- @Deprecated: 用于表示所修飾的元素(類, 方法等)已過時(shí)。通常是因?yàn)樗揎椀慕Y(jié)構(gòu)危險(xiǎn)或存在更好的選
- @SuppressWarnings: 抑制編譯器警告
示例三:跟蹤代碼依賴性,實(shí)現(xiàn)替代配置文件功能


2.3 自定義Annotation
- 注解聲明為:@interface
- 內(nèi)部定義成員,通常使用用value表示
- 可以指定成員的默認(rèn)值,使用default定義
- 如果自定義注解沒有成員,表明是一個(gè)標(biāo)識(shí)作用
public @interface MyAnnotation {
String value() default "hi"
}
@MyAnnotation("hello")
class CalssTest{
@MyAnnotation //可以不寫值,因?yàn)橐呀?jīng)有默認(rèn)值"hi"
void show(){
System.out.println("這是一個(gè)注解測(cè)試");
}
}
2.4 JDK中的元注解
什么是元注解
元注解是指用于修飾其它注解的注解
JDK中的4個(gè)元注解
- Retention: 用于指定該 Annotation 的生命周期:SOURCE、CLASS、RUNTIME。
- Target:用于指定被修飾的 Annotation 能用于修飾哪些程序元素。
- Documented:被該元注解修飾的Annotation 類將被javadoc工具提取成文檔。
- Inherited:被它修飾的Annotation將具有繼承性。如果某個(gè)類使用了被@Inherited修飾的Annotation,則其子類將自動(dòng)具有該注解。
2.5 JDK8中注解的新特性
可重復(fù)注解
使用注解修飾時(shí),可以使用該注解多次修飾,JDK8之前的方法是創(chuàng)建該注解的數(shù)組注解,進(jìn)行修飾,JDK8之后可以重復(fù)行修飾。
使用步驟:
- 在MyAnnotation上聲明@Repeatable,成員值為MyAnnotations.class
- MyAnnotation的Target和Retention注解與MyAnnotations相同
類型注解
ElementType.TYPE_PARAMETER: 表示該注解能寫在類型變量的聲明語句中(如:泛型聲明)。
ElementType.TYPE_USE:表示該注解能寫在使用類型的任何語句中。