列舉和註解
定義:即直接把類具體的物件一個一個列舉出來,且是隻讀物件。
enumeration簡寫為enum。
實現方式:
-
-
將構造器私有化,防止new。
-
可以提供get方法,但必須去掉set相關方法,防止屬性被修改。
-
在其內部,直接創鍵固定物件。
-
優化,可以再加入final修飾符,效率更高,不會導致類載入。
//Season列舉類 只有四個固定物件,春夏秋冬
public class Enumeration01 {
public static void main(String[] args) {
System.out.println(Season.SPRING);
System.out.println(Season.WINTER);
}
}
class Season{
private String name;//季節名
private String desc;//季節描述
//定義需要物件
public static Season SPRING = new Season("春天","溫暖");
public static Season SUMMER = new Season("夏天","炎熱");
public static Season AUTUMN = new Season("秋天","涼爽");
public static Season WINTER = new Season("冬天","寒冷");
//將構造器修改為private
private Season(String name, String desc) {
this.name = name;
this.desc = desc;
}
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
-
-
使用enum來實現列舉
-
使用關鍵字 enum 替代 class
-
public static Season SPRING = new Season("春天","溫暖");
直接用:SPRING("春天","溫暖") 代替 即 常量名(實參列表)
-
如果有多個常量(物件),使用 , 間隔。最後一個帶 ;
-
如果使用emun 來實現列舉類,要求將定義常量物件,寫在前面。
-
如果我們使用無參構造器,則可以省略 () 。
public class Test {
public static void main(String[] args) {
System.out.println(Season.SPRING);
System.out.println(Season.WINTER);
}
}
enum Season{
//常量物件必須寫在類的最前面
SPRING("春天","溫暖"),SUMMER("夏天","炎熱"),
AUTUMN("秋天",
private String name;//季節名
private String desc;//季節描述
private Season(String name, String desc) {
this.name = name;
this.desc = desc;
}
...//get方法和toString
} -
Enum類
注意:在使用enum關鍵字時,會隱式繼承Enum類,因此在開發過程中,往往會使用Enum類的相關方法。如:name()、ordinal()、values() 注:此方法在Enum原始碼中隱藏 & 增強for、valueOf()、compareTo()
public class EnumMethods {
public static void main(String[] args) {
//name()方法來自Enum類,作用: 返回類名
System.out.println(Person.JACK.name());
System.out.println(Person.JACK.getName());//注意 此name非彼name
//ordinal() 作用:返回該物件次序(從0開始算)
System.out.println(Person.JAY.ordinal());
//values() 作用:放回一個物件陣列,次序同對象定義次序
Person[] p = Person.values();
for(Person person: p){//增強for迴圈
// for(類名 自定義物件名 : 與類名相同陣列名) 從0序號賦值給物件名,直至陣列結束
// 如:
// int[] A = new int[10]; //...A賦值
// for(int a : A)//每次迴圈從A陣列賦值給a,直至陣列賦值結束
System.out.println(person);
}
//valueOf() 根據輸入的字串,判斷是否有列舉物件名字和該字串匹配
//有則返回該物件,無則報錯
Person peo = Person.valueOf("JAY");
System.out.println(peo);
//compareTo() 比較兩個同類列舉物件的次序,返回前一個的ordinal值 - 後一個
//如:JACK是次序是0 LILY順序是3 則返回 -3
System.out.println(Person.JACK.compareTo(Person.LILY));
}
}
enum Person{
JACK("傑克"),JAMES("詹姆斯"),JAY("周"),LILY("莉莉");
private String name;
Person(String name) {
this.name = name;
}
...//get 和 toString
}
注意:
-
使用enum關鍵字後,無法繼承其他類。(因為enum預設隱式繼承了Enum類,且Java的類是單繼承機制)
-
列舉類可以實現介面
switch(); 可以用enum物件作用物件
public class Homework08 {
public static void main(String[] args) {
Color color = Color.BLUE;
//switch 可以使用enum類
//在switch() 中,放入列舉物件
//在每個case後,直接寫上列舉類中,定義的列舉物件
switch (color) {
case RED:
System.out.println("匹配到紅色");
break;
case BLUE:
System.out.println("匹配到藍色");
break;
default:
System.out.println("沒有匹配到");
}
}
}
interface IA {
void show();
}
enum Color implements IA {
RED(255, 0, 0), BLUE(0, 0, 255), BLACK(0, 0, 0), YELLOW(255, 255, 0), GREEN(0, 255, 0);
private int redValue;
private int blueValue;
private int greenValue;
Color(int redValue, int blueValue, int greenValue) {
this.redValue = redValue;
this.blueValue = blueValue;
this.greenValue = greenValue;
}
註解Annotation
註解也被稱為元資料(Metadata),用於修飾解釋包、類、方法、屬性、構造器、區域性變數等資訊。註解不影響程式邏輯,但註解可以被編譯或執行。
JavaSE中,註解作用不大,但在JavaEE中,可以用來配置切面等。
@interface 即為一個註解類。
@Override
只能用於繼承的子類的方法上。
作用,如果加了該註解,編譯器就會判斷是否真的重寫了父類方法,如果的確重寫,則通過編譯,否則報錯。
@Target
修飾註解的註解,稱為元註解
@Deprecated
-
用於表示修飾某個元素已經過時了。
-
表示不再推薦使用,但是依舊可以使用。
-
可以修飾構造器、類、方法、包等(如@Target所示)
-
用處:用於版本過度,升級使用
@SuppressWarnings
用法:如 @SuppressWarnings({"unused","rawtypes"})
該註解用於抑制警告。
可用於{TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE}。
這裡給出一些常見的需要抑制的警告
-
unchecked 忽略沒有檢查的警告
-
rawtypes 忽略沒有指定泛型的警告
-
unused 忽略沒有使用某個變數的警告
元註解
即用於修飾註解的註解。
-
Retention (n. 保留;保持) //指定註解的作用範圍:SOURCE (編譯器使用後,即捨棄的註解)、CLASS (編譯器把該註解記錄在 .class 檔案中,執行前捨棄)、RUNTIME (編譯器把該註解記錄在 .class 檔案中,且執行時JVM也會保留該註解。故反編譯 .class 檔案時可以得到該註解)
-
Target (n. 目標) //這個註解的使用範圍,即可以用於哪些地方
-
Document (n. 檔案; v. 記錄) //該註解會使它修飾的註解,能在被javadoc提取成文件時,看到其修飾的註解。 如 @Deprecate 有被@Document修飾,則文件中會保留@Deprecate
-
Inherited (v. 繼承) //使其修飾的 Annotation 具有繼承性。即某個類使用了被 @Inherited修飾的Annotation,則其子類將自動具有該註解
-