枚举类
一、如何自定义枚举类
- 对象有个有限、确定个
- 例子

- 定义一组常量时也建议使用枚举类
- 如果枚举类中只有一个对象,则可以使用单例模式
二、 如何使用关键词enum定义枚举类
- jdk5.0 前自定义
- jdk5.0后enum定义
1. 自定义枚举类
-
属性私有化、常量化——private final 修饰
- 开始private final给属性会报错,因为常量没有值需要初始化
-
构造器私有化——private 修饰
- 有三种给属性初始化的方式
- 直接属性赋值——定义完后不能修改,单例可以使用
- 构造器赋值——可修改,如季节属性——春夏秋冬四个值,因此使用构造器初始化
- 方法赋值set/get——可修改,定义的常量外部不能赋值,因此不用set/get
- 有三种给属性初始化的方式
-
提供枚举类的多个对象——public static final 修饰
- 在枚举类内部实例化完,外部不用new直接调用对象
-
其他诉求
-
获取枚举类对象的属性
-
提供toString的方法——因为默认打印地址值
-
System.out.println(spring); //输出结果为com.enumdemo.Season@1b6d3586而不是春天
-
-
1.1 例子
public class SeasonTest {
public static void main(String[] args) {
Season spring = Season.SPRING;//可以直接给spring用常量SPRING对象赋值
System.out.println(spring.toString());
String result = spring.getSeason();
System.out.println(result);
}
}
/*
春天的描述:春暖花开
春天
*/
public class Season {
//属性私有化、常量化
private final String season;
private final String description;
//构造器私有化
private Season (String seasonName, String seasonDesc) {
this.season = seasonName;
this.description = seasonDesc;
}
//实例化对象——公共、静态、常量
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("冬天","冰天雪顶");
//其他诉求1 获取属性——季节名
public String getSeason() {
return season;
}
public String getDescription() {
return description;
}
//其他诉求2 重写打印方法
@Override
public String toString() {
return season+"的描述:" + description;
}
}
2. enum定义
-
通过Enum代替class去定义类
-
实例化对象要第一个写——其余与自定义枚举类一样
-
//Enumd定义: SPRING("春天","春暖花开"), SUMMER("夏天","夏日炎炎"); //自定义 : public static final Season SPRING = new Season("春天","春暖花开"); public static final Season SUMMER = new Season("夏天","夏日炎炎");- 不用public static final修饰
- 不用标明对象类型
- 不同new关键词调用构造器
- 多个对象之间用”,“代替";"
-
2.1 例子
public class Test {
public static void main(String[] args) {
Season1 spring = Season1.SPRING;
//不用重写toString,父类已经重写好了
System.out.println(spring);//SPRING
System.out.println(spring.getSeason());//春天
System.out.println(spring.getDescription());//春暖花开
//说明定义的枚举类继承于父类java.lang.Enum
System.out.println(Season1.class.getSuperclass());//class java.lang.Enum
}
}
package com.enumdemo;
enum Season1 {
//实例化对象
SPRING("春天","春暖花开"),
SUMMER("夏天","夏日炎炎"),
AUTUMN("秋天","秋高气爽"),
WINTER("冬天","冰天雪地");
//私有化、常量化属性
private final String season;
private final String description;
//私有化构造器
private Season1(String seasonName, String seasonDesc) {
season = seasonName;
description = seasonDesc;
}
//其他诉求1——获取获取属性
public String getSeason() {
return season;
}
public String getDescription() {
return description;
}
}
-
不重写toString也不会返回地址值,因为父类已经重写好了

三、Enum类的主要方法
- values()——返回一个所有对象名组成的数组
- valueOf(String str)
- 返回一个enum类中与str相同的对象名
- 如果enum类中没有该对象名则抛出异常illegalArgumentException
- toString——返回对象名
1. 例子
public class Test {
public static void main(String[] args) {
//toString()
Season1 spring = Season1.SPRING;
System.out.println(spring);//SPRING
//values()
Season1[] array = Season1.values();
System.out.println(Arrays.toString(array));
//[SPRING, SUMMER, AUTUMN, WINTER]
//value of()
Season1 a = Season1.valueOf("SPRING");
System.out.println(a);//SPRING
}
}
四、实现接口的枚举类
-
接口在enum类中实现抽象方法
-
让枚举类的对象分别实现接口中的抽象方法
1. 接口重写方法
public class Test {
public static void main(String[] args) {
Season1 winter = Season1.WINTER;
winter.show();
//这是一个季节
}
}
public interface SeasonInfo {
void show();
}
enum Season1 implements SeasonInfo{
//实例化对象
SPRING("春天","春暖花开"),
SUMMER("夏天","夏日炎炎"),
AUTUMN("秋天","秋高气爽"),
WINTER("冬天","冰天雪地");
//私有化、常量化属性
private final String season;
private final String description;
//私有化构造器
private Season1(String seasonName, String seasonDesc) {
season = seasonName;
description = seasonDesc;
}
//其他诉求1——获取获取属性
public String getSeason() {
return season;
}
public String getDescription() {
return description;
}
@Override
public void show() {
System.out.println("这是一个季节");
}
}
- 在enum类中重写了接口中的抽象show方法
2. 让每个对象各自实现接口中的抽象方法
public class Test {
public static void main(String[] args) {
Season1 winter = Season1.WINTER;
winter.show();
//大约在冬季
}
}
public interface SeasonInfo {
void show();
}
enum Season1 implements SeasonInfo{
//实例化对象
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("大约在冬季");
}
};
//私有化、常量化属性
private final String season;
private final String description;
//私有化构造器
private Season1(String seasonName, String seasonDesc) {
season = seasonName;
description = seasonDesc;
}
//其他诉求1——获取获取属性
public String getSeason() {
return season;
}
public String getDescription() {
return description;
}
}

浙公网安备 33010602011771号