package com.itheima.day1;
public class WeekDay
{
private WeekDay(){}
public static final WeekDay SUN = new WeekDay();
public static final WeekDay MON = new WeekDay();
public WeekDay
nextDay(){
if(this == SUN){
return MON ;
} else{
return SUN ;
}
}
public String
toString(){
return this == SUN? "SUN":"MON" ;
}
}
注意:
可以採用抽象方法定義nextDay將大量的if...else語句轉移到一個個獨立的對象中實現。
WeekDay.java
package com.itheima.day1;
public abstract class WeekDay
{
private WeekDay(){}
public static final WeekDay SUN = new WeekDay(){
public WeekDay
nextDay(){
return MON ;
}
};
public static final WeekDay MON = new WeekDay(){
public WeekDay
nextDay(){
return SUN ;
}
};
public abstract WeekDay
nextDay();
public String
toString(){
return this == SUN? "SUN":"MON" ;
}
}
2-5-3 Java5枚舉的基本應用
示例:
EnumTest.java
package com.itheima.day1;
public class EnumTest
{
public static void main(String[]
args) {
WeekDay day = WeekDay.FRI;
System.out.println(day);
//結果:FRI
System.out.println(day.name());
//結果:FRI
System.out.println(day.ordinal());
//結果:5
System.out.println(WeekDay. valueOf("SUN"));
//結果:SUN
System.out.println(WeekDay. values().length);
//結果:7
}
public enum WeekDay{
SUN,MON ,TUE,WED, THI,FRI ,SAT;
}
}
總結:
枚舉是一種特殊的類,其中的每個元素都是該類的一個實例對象,例如可以調用WeekDay.SUN.getClass().getName和WeekDay.class.getName()。
注意:
最後一個枚舉元素後面可以加分號,也可以不加分號。
2-5-4 實現帶有構造方法的枚舉
·枚舉就相當於一個類,其中也可以定義構造方法、成員變量、普通方法和抽象方法。
·枚舉元素必須位於枚舉體中的最開始部分,枚舉元素列表的最後要有分號與其他成員分隔。把枚舉中的成員方法或變量等放在枚舉元素的前面,編譯器會報告錯誤。
·帶構造方法的枚舉:
構造方法必須定義成私有的
如果有多個構造方法,將根據枚舉元素創建時所帶的參數決定選擇哪個構造方法創建對象。
枚舉元素MON和MON()的效果一樣,都是調用默認的構造方法。
示例:
EnumTest.java
package com.itheima.day1;
public class EnumTest
{
public static void main(String[]
args) {
WeekDay day = WeekDay.FRI;
}
public enum WeekDay{
SUN(1),MON (),TUE, WED,THI ,FRI,SAT;
private WeekDay(){
System. out.println("first" );
}
private WeekDay(int value){
System. out.println("second" );
}
//結果:
//second
//first
//first
//first
//first
//first
//first
}
}
2-5-5 實現帶有抽象方法的枚舉
定義枚舉TrafficLamp。
實現抽象的nextTrafficLamp方法:每個元素分別是由枚舉類的子類來生成的實例對象,這些子類採用類似內部類的方式進行定義。
增加上表示時間的構造方法。
示例:
EnumTest.java
package com.itheima.day1;
public class EnumTest
{
public static void main(String[]
args) {
TrafficLamp lamp = TrafficLamp.RED;
System. out.println(lamp.nextLamp());
//結果:GREEN
}
public enum TrafficLamp{
RED(30)
{
public TrafficLamp
nextLamp() {
return GREEN ;
}
}, GREEN(45)
{
public TrafficLamp
nextLamp() {
return YELLOW ;
}
}, YELLOW(5)
{
public TrafficLamp
nextLamp() {
return RED ;
}
};
private int time;
private TrafficLamp(int time){
this.time =
time;
}
public abstract TrafficLamp
nextLamp();
}
}
注意:
1、枚舉只有一個成員時,就可以作爲一種單例的實現方式。
2、查看生成的class文件,可以看到內部類對應的class文件。