枚举类的基础知识整理

什么是枚举类?

对象有限且固定不变的类,在Java里被称为枚举类。例如季节类,它只有春夏秋冬四个实例,因此可以用枚举类来表示。

/**
 * @description: 季节枚举类
 * @author: Murphy
 * @date: 2020/6/274:08 上午
 */
public enum Season {
    SPRING, SUMMER, AUTUMN, WINTER;
}

枚举类是一个特殊的类,它一样可以有自己的成员变量、成员方法、构造器,可以实现一个或多个接口。

枚举类的优势和特征

枚举类的优势

①有些类的实例有限且固定,需要一些特定且方便的方式来表示这些类;

②使用枚举类可以使程序更加健壮,避免创建对象的随意性;

③避免一些常量值的意义不明确。

枚举类的特征

①枚举类默认继承了java.lang.Enum类,因此不能再继承其他的类;

②非抽象的枚举类默认会使用final关键字修饰,因此非抽象的枚举类不能被其他类继承;

③枚举类的构造器只能用private关键字修饰,如果用其他的访问权限修饰符修饰则编译会报错;

④枚举类的所有实例必须在枚举类的第一行显示列出,否则这个枚举类永远不可能产生实例,这些实例默认被public static final所修饰,不同实例之间以逗号分隔,分号结束,实例名称所有字母需大写;

⑤枚举类每个实例成员变量的值是不能改变的,应该用private final修饰。

初始化成员变量的方法

因为枚举类的所有成员变量都要用private final修饰,因此需要使用下面三种方法为成员变量指定初始值:

①在构造器里为这些成员变量指定初始值;

②在定义成员变量时指定默认值;

③在静态代码块中指定初始值。

其中,最常用的是第一种方法。

public enum Season {
    SPRING("春天"), SUMMER("夏天"), AUTUMN("秋天"), WINTER("冬天");
    private final String name;

    Season(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

在JDK1.5中switch对枚举类的扩展

switch()流程控制语句中的条件语句可以是枚举类型,此时case表达式中的值可以直接使用枚举类对象的值。

/**
 * @description: 季节枚举类
 * @author: Murphy
 * @date: 2020/6/274:08 上午
 */
public enum Season {
    SPRING("春天"), SUMMER("夏天"), AUTUMN("秋天"), WINTER("冬天");
    private final String name;

    Season(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void method(Season season) {
        switch (season) {
            case SPRING:
                System.out.println("春天到了");
                break;
            case SUMMER:
                System.out.println("夏天到了");
                break;
            case AUTUMN:
                System.out.println("秋天到了");
                break;
            case WINTER:
                System.out.println("冬天到了");
                break;
            default:
                System.out.println("这不是一个季节");
        }
    }
}

实现接口的枚举类

实现接口的枚举类,不同的实例可以提供不同的接口实现方式。

/**
 * @description: 定义一个接口
 * @author: Murphy
 * @date: 2020/6/275:17 上午
 */
public interface Info {
    void info();
}

//实现接口的一般形式
/**
 * @description: 季节枚举类
 * @author: Murphy
 * @date: 2020/6/274:08 上午
 */
public enum Season implements Info {
    SPRING("春天"), SUMMER("夏天"), AUTUMN("秋天"), WINTER("冬天");
    private final String name;

    Season(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    @Override
    public void info() {
        System.out.println("重写接口中的方法");
    }
}

//枚举类实现接口的特有方式
/**
 * @description: 季节枚举类
 * @author: Murphy
 * @date: 2020/6/274:08 上午
 */
public enum Season implements Info {
    SPRING("春天") {
        @Override
        public void info() {
            System.out.println("这是春天");
        }
    }, SUMMER("夏天") {
        @Override
        public void info() {
            System.out.println("这是夏天");
        }
    }, AUTUMN("秋天") {
        @Override
        public void info() {
            System.out.println("这是秋天");
        }
    }, WINTER("冬天") {
        @Override
        public void info() {
            System.out.println("这是冬天");
        }
    };

    private final String name;

    Season(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

你可能感兴趣的:(Murphy从零开始学Java)