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文件。