什么是枚举
1.在jdk5之前,是通过抽象类 私有化构造方法 并在类的内部提供公有 静态 常量的 当前类对象来实现枚举的
2.而在jdk5中,java提供了新的关键字叫enum来实现枚举类型,大大简化了这个过程
3.枚举是在类里面写有构造方法,这些构造方法是私有的,外部类不可调用,因此你不能用枚举类来构造新的对象,枚举类里面提供什么对象你就只能用什么对象。
4.枚举类中的构造方法内定义的参数都是静态常量,也就是说不可以对里面的参数进行修改。简而言之,就是我给你啥你就只能用啥。
5.例如,我们为果汁店设计一个程序,它将限制果汁为小杯、中杯、大杯。这就意味着它不允许顾客点除了这三种尺寸外的果汁。
实例一
枚举的原理
public class Demo1 { public static void main(String[] args) { } } /** * 枚举 */ enum WeekEnum01{ Mon,Tue,Wed,Thu,Fri,Sat,Sun } /** * 枚举的原理 */ class Week01{ private Week01() { } public static final Week01 Mon = new Week01(); public static final Week01 Tue = new Week01(); public static final Week01 Wed = new Week01(); public static final Week01 Thu = new Week01(); public static final Week01 Fri = new Week01(); public static final Week01 Sat = new Week01(); public static final Week01 Sun = new Week01(); }
实例二
package Enum; public class Demo2 { public static void main(String[] args) { System.out.println(Week2.Fri.getDay()); System.out.println(Week2.Fri.isRestDay()); System.out.println(WeekEnum2.Fri.getDay()); System.out.println(WeekEnum2.Fri.isRestDay()); } } //在JDK5之后,有了enmu关键字 ,便于实现枚举 //--包含成员属性 //--包含私有构造方法 //--包含普通方法 //--包含抽象方法 enum WeekEnum2{ Mon(1){ @Override public boolean isRestDay() { return false; } },Tue(2){ @Override public boolean isRestDay() { return false; } },Wed(3){ @Override public boolean isRestDay() { return false; } },Thu(4){ @Override public boolean isRestDay() { return false; } },Fri(5){ @Override public boolean isRestDay() { return false; } },Sat(6){ @Override public boolean isRestDay() { return true; } },Sun(7){ @Override public boolean isRestDay() { return true; } }; private int day = 0; private WeekEnum2(int day){ this.day = day; } public int getDay(){ return day; } public abstract boolean isRestDay(); } //在JDK5之前,手动实现枚举效果 //--包含成员属性 //--包含私有构造方法 //--包含普通方法 //--包含抽象方法 abstract class Week2{ public static final Week2 Mon = new Week2(1){ @Override public boolean isRestDay() { return false; } }; public static final Week2 Tue = new Week2(2){ @Override public boolean isRestDay() { return false; } }; public static final Week2 Wed = new Week2(3){ @Override public boolean isRestDay() { return false; } }; public static final Week2 Thu = new Week2(4){ @Override public boolean isRestDay() { return false; } }; public static final Week2 Fri = new Week2(5){ @Override public boolean isRestDay() { return false; } }; public static final Week2 Sat = new Week2(6){ @Override public boolean isRestDay() { return true; } }; public static final Week2 Sun = new Week2(7){ @Override public boolean isRestDay() { return true; } }; private int day = 0; private Week2(int day) { this.day = day; } public int getDay(){ return this.day; } public abstract boolean isRestDay(); }
运行结果:
5 false 5 false
程序解读:
Mon(1){
@Override
public boolean isRestDay() {
return false;
}
Mon 相当于在枚举类的内部实例化了一个对象,它的底层相当于
public static final WeekEnum2 Mon = new WeekEnum2(1){
@Override
public boolean isRestDay() {
return false;
}
};
因为构造方法只有一个,且是有参构造,所以在实例化对象的时候需要传入一个参数。
例如:String str = new String("a");