enum SeasonEnum  //这是一个枚举类,有四个枚举值
{
        SPRING,SUMMER,FALL,WINTER;
}
public class EnumTest
{
        public void judge(SeasonEnum s)
        {
                switch(s)
                {
                        case SPRING:
                                System.out.println("春天");
                                break;
                        case SUMMER:
                                System.out.println("夏天");
                                break;
                        case FALL:
                                System.out.println("秋天");
                                break;
                        case WINTER:
                                System.out.println("冬天");
                                break;
                }
        }
 public static void main(String[] args)
        {
                for (SeasonEnum s : SeasonEnum.values())
                {
                        System.out.println(s);
                }
                new EnumTest().judge(SeasonEnum.SPRING);
        }
}

枚举类有两种:抽象枚举类和非抽象枚举类。

抽象枚举类:这个枚举类里要有抽象方法,但是不一定必须有

非抽象枚举类:默认使用final修饰,因此枚举类不能派生子类,但是,不是说抽象类枚举类也不能派生子类。

enum关键字!

枚举类是一个特殊的类,但是它也有类Feild,方法,构造器

枚举类的实例只能是枚举值,枚举类创建实例的时候不是使用new来创建的,枚举值就是实例。



enum Gender
{
        MALE,FEMALE;//这是两个枚举值
        public String name;//可见枚举类也有Feild,这是一个实例Feild(实例变量)
}
public class GenderTest
{
        public static void main(String[] args)
        {
                //通过Enum的valueOf方法,来获得指定的枚举类的枚举值
                Gender g = Enum.valueOf(Gender.class,"FEMALE"); //取出FEMALE枚举值给g引用变量
                //直接为枚举值的Feild赋值
                g.name = "女";
                System.out.println(g + "代表:" + g.name);
                //输出结果是”FEMALE 代表:女“
        }
}//缺点:FEMALE枚举值可能会被输出成“男”,需要想办法把枚举值给固定了,就是让MALE只能输出男,FEMALE只能输出女


上面的缺点很明显,我们可以改进,让枚举类使用setter方法和getter方法

enum Gender
{
        MALE,FEMALE;
        private String name;
        public void setName(String name)
        {
                switch(this)//this可能是MALE和FEMALE这两个枚举值
                {
                        case MALE:
                                if(name.equals("男"))
                                {
                                        this.name = name;
                                }
                                else
                                {
                                        System.out.println("参数错误");
                                }
                        case FEMALE:
                                if(name.equals("女"))
                                {
                                        this.name = name;
                                }
                                else
                                {
                                        System.out.println("参数错误");
                                }
                }
        }
        public String getName()
        {
                return this.name;
        }
}
public class GenderTest2
{
        public static void main(String[] args)
        {
                Gender g = Enum.valueOf(Gender.class,"FEMALE");
                g.setName("女");
                System.out.println(g + "代表" + g.getName());
                g.setName("男");
                System.out.println(g + "代表" + g.getName());
        }
}
                                                                                             44,1          Bot


上面的设计其实还是不够好,虽然当我们使用FEMALE等于男是,会显示参数错误,但是我们一般将枚举类设计成不可变类,它的Field值不应该被改变,这样更安全和简洁,为此,我们的枚举类中的Field一般都是用pivate final来修饰

因为我们将所有的Field都用final修饰了,所以,我们必须在构造器中为这些Field指定初始值。

下面是一个在构造器中为枚举类指定初始值

enum Gender
{
        MALE("男"),FEMALE("女");
        //枚举值,枚举值是枚举类的实例,现在就是在给实例赋了一个初始值
        //你也许看不懂,没有看出来,这哪里创建实例了?,其实枚举类创建实例就是这样,不使用new
        //这两个枚举值其实已经调用了下面的构造器了
        private final String name;//Field
        private Gender(String name)//构造器
        {
                this.name = name;
        }
        public String getName()
        {
                return this.name;
        }
}
public class GenderTest3
{
        public static void main(String[] args)
        {
                //创建了一个Gender类型的引用变量b
                //使用Enum.valueOf方法,来调用FEMALE这个实例,或者说是对象,或者说是枚举值
                //Gender.class 干嘛用到还不知道
                Gender b = Enum.valueOf(Gender.class,"FEMALE");
                System.out.println(b.getName());
        }
}

上面运行:

[root@server254 java]# java GenderTest3

发现:我们创建了实例FEMALE就只能输出女