Java 枚举

什么是枚举

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");

原文地址:https://www.cnblogs.com/chuijingjing/p/9561219.html