如何實現讓一個類有固定個數的對象
手動封裝構造方法(private) → 創建靜態對象 → final修飾靜態對象,使其成為常量
class Season { //枚舉類public final static Season SPRING = new Season();public final static Season SUMMER = new Season();public final static Season SUTUMN = new Season();public final static Season WINTER = new Season();private Season() {}public void show() {System.out.println("hello");}
}
class Demo7 {public static void main(String[] args) {Season chunji = Season.SPRING;chunji.show();}
}
enum
從 JDK1.5 開始
enum Season {SPRING,SUMMER,AUTUMN,WINTER //枚舉項,枚舉常量
}
class Demo7{public static void main(String[] args) {Season chunji = Season.SPRING;chunji.show();}
}
反編譯后,跟上一個步驟類似
枚舉類的本質就是一個類,被final修飾了,不能有子類,繼承了java.lang.Enum
枚舉類方法
-
int ordinal()
返回枚舉項的編號,每個枚舉項都有一個編號,編號從0開始enum Week{MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY } class Demo10{public static void main(String[] args){Week[] weeks={Week.MONDAY,Week.TUESDAY,Week.WEDNESDAY,Week.THURSDAY,Week.FRIDAY,Week.SATURDAY,Week.SUNDAY};System.out.println(weeks[0].ordinal());//0System.out.println(weeks[2].ordinal());//2System.out.println(weeks[6].ordinal());//6
-
int compareTo(E o)
比較枚舉項的大小,比較的是編號System.out.println(weeks[6].compareTo(weeks[2]));//4 System.out.println(weeks[2].compareTo(weeks[4]));//-2 System.out.println(weeks[2].compareTo(weeks[2]));//0
-
String name()
返回枚舉常量的名稱,與其枚舉聲明中聲明的完全相同System.out.println(weeks[6].name());//SUNDAY System.out.println(weeks[4].name());//FRIDAY
-
String toString()
返回聲明中包含的此枚舉常量的名稱System.out.println(weeks[6].toString());//SUNDAY System.out.println(weeks[4].toString());//FRIDAY
-
static <T extends Enum> T value0f(Class enumType, String name)
返回具有指定名稱的指定枚舉類型的枚舉常量Week obj = Enum.valueOf(Week.class,"MONDAY"); //MONDAY
-
public static Week[] values()
得到所有枚舉項的數組Week[] arr = Week.values(); for(Week wk:arr)System.out.println(wk);//MONDAY TUESDAY WEDNESDAY ……
-
public static Week valueOf(java.lang.String);
返回具有指定名稱的指定枚舉類型的枚舉常量Week xingqi = Week.valueOf("MONDAY"); System.out.println(xingqi);//MONDAY
定義屬性
enum中構造方法默認被private修飾
enum Season{SPRING("春季"),SUMMER("夏季"),AUTUMN("秋季"),WINTER("冬季"); private String desc;Season(){} //默認就是privateSeason(String desc){//默認就是privatethis.desc=desc;}public String getDesc(){return desc;}public String toString(){return desc;}
}
class Demo11{public static void main(String[] args){Season ss = Season.SUMMER;System.out.println(ss);}
}
定義方法
靜態、非靜態方法
enum Season{……………………public static void show(){System.out.println("Hello");}public void fun(){System.out.println("fun");}
}
class Demo12
{public static void main(String[] args) {Season xiaji=Season.SUMMER;xiaji.show();xiaji.fun();}
}
抽象方法
含有抽象方法前的枚舉類前不用寫abstract,在每個枚舉項里都必須重寫抽象方法
enum Season{SPRING("春季"){public void show(){System.out.println("春季");}},SUMMER("夏季"){public void show(){System.out.println("夏季");}},AUTUMN("秋季"){public void show(){System.out.println("秋季");}},WINTER("冬季"){public void show(){System.out.println("冬季");}}; ……………………public abstract void show();
}
class Demo13
{public static void main(String[] args){Season.WINTER.show();}
}
實現接口
interface inter{void ff();
}
enum Season implements inter{SPRING("春季"),SUMMER("夏季"),AUTUMN("秋季"),WINTER("冬季"); ………………public void ff(){System.out.println("ok");}
}
class Demo14{public static void main(String[] args){Season.AUTUMN.ff();Enum jijie=Season.WINTER; //多態Object obj=Season.WINTER;}
}
練習
定義一個Person類,有姓名和性別屬性,性別定義成枚舉
enum Gender{MALE("男"),FEMALE("女");private String desc;Gender(){}Gender(String desc){this.desc=desc;}public String toString(){return desc;}
}
class Person{private String name;private Gender sex;Person(){}Person(String name,Gender sex){this.name=name;this.sex=sex;}public String toString(){return name+","+sex;}
}
class Demo15 {public static void main(String[] args) {Person ren=new Person("趙四",Gender.MALE);System.out.println(ren);//趙四,男}
}