JKD 5.0以前—自定义枚举类

以前的真的和类没啥区别,直接上代码,感觉没啥好说的。

public class EnumTest {
    public static void main(String[] args) {
        System.out.println(Season.SPRING.toString());
    }
}
/*
自定义枚举类
 */
class Season{
    //1.声明Season对象的属性:private final修饰
    private final String seasonName;
    private final String seasonDesc;

    //2.私有化类的构造器,并给对象属性赋值
    private Season(String seasonName,String seasonDesc){
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }

    //3.提供当前枚举类的多个对象:public static fianl的
    public static final Season SPRING = new Season("春天", "春暖花开");
    public static final Season SUMMER = new Season("夏天", "夏日炎炎");
    public static final Season AUTUMN = new Season("秋天", "秋高气爽");
    public static final Season WINTER = new Season("冬天", "冰天雪地");

    //4.1其他方法
    public String getSeasonName() {
        return seasonName;
    }

    public String getSeasonDesc() {
        return seasonDesc;
    }

    //4.2提供ToString()
    @Override
    public String toString() {
        return "Season{" +
                "seasonName='" + seasonName + '\'' +
                ", seasonDesc='" + seasonDesc + '\'' +
                '}';
    }
}
JDK 5.0以后—用enum关键字定义枚举类

常用方法:

  1. values()方法:返回枚举类型的对象数组。该方法可以很方便地遍历所有的常量。
  2. valueOf(String str):可以把一个字符串转为对应的枚举类对象。要求字符串必须是枚举类对象的“名字”。 如不是,会有运行时异常:illegalArgumentException.
  3. toString();返回当前枚举类对象常量的名称。

规则

  • 一开始就提供当前枚举类的对象,必须省略public static fianl,以逗号隔开,最后一个分号。
  • 声明当前枚举类的属性:private final修饰。
  • 提供私有化的有参构造器,并赋值。
  • 可以放抽象方法等等,前面的对象记得实现。
  • 可以提供其他方法getter()、toString(),看自己需求。

特殊情况----实现接口在enum类中实现抽象方法:

interface showInfo{
    void show();
}
public class EnumTest1 {
    public static void main(String[] args) {
        //调用ToString方法,没重写则为SPRING
        System.out.println(Season1.SPRING);
        //调用values()
        Season1[] values = Season1.values();
        for (int i = 0; i < values.length; i++) {
            System.out.println(values[i]);
        }
        //调用valueOf(String objName):返回枚举类型中对象名是ObjName的对象
        Season1 spring = Season1.valueOf("SPRING");
        System.out.println(spring);
		//调用重写的方法show()
		Season1.SPRING.show();
    }
}

enum Season1 implements showInfo{
	//隐式父类不为Object,为Enum,不重写默认打印对象名,例如SPRING
    //提供当前类的枚举对象,多个之间用","隔开
    SPRING("春天", "春暖花开"){
        @Override
        public void show() {
            System.out.println("春天是适合播种的季节");
        }
    },
    SUMMER("夏天", "夏日炎炎"){
        @Override
        public void show() {
            System.out.println("夏天是适合游泳的季节");
        }
    },
    AUTUMN("秋天", "秋高气爽"){
        @Override
        public void show() {
            System.out.println("秋天是适合收获的季节");
        }
    },
    WINTER("冬天", "冰天雪地"){
        @Override
        public void show() {
            System.out.println("冬天是适合睡觉的季节");
        }
    };

    //1.声明Season对象的属性:private final修饰
    private final String seasonName;
    private final String seasonDesc;

    //2.私有化类的构造器,并给对象属性赋值
    private Season1(String seasonName, String seasonDesc) {
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }


    //4.1其他方法
    public String getSeasonName() {
        return seasonName;
    }

    public String getSeasonDesc() {
        return seasonDesc;
    }

    //4.2提供ToString(),不重写则使用Enum中的ToString()方法打印对象名(SPRING)
    @Override
    public String toString() {
        return "Season1{" +
                "seasonName='" + seasonName + '\'' +
                ", seasonDesc='" + seasonDesc + '\'' +
                '}';
    }

//    @Override
//    public void show() {
//        System.out.println("这是一个季节");//这种没什么好说的
//    }
}