Java知识点总结:想看的可以从这里进入

2.3、枚举类

2.3.1、概念

枚举类型是Java 5中增加的一些特性,通过 enum 关键字定义,枚举类既是一种类(内部可以有方法和属性)却又比类多了些特殊的约束。

  • 使用的场景

    • 某个类的对象是有限且固定的:季节类只有春夏秋冬四个对象、月份只有12个月、一星期只有7天、男女性别、支付方式等等。

    • 创建单例模式的时候,内部只有一个对象。而枚举就是最简单的单例模式创建方式

  • 使用规则

    • 不能被继承
    • 不能被单独的new创建对象
    • 枚举成员是用,隔开的,且枚举类的实例成员必须在最前面显式列出,否则不能派生子类,这些列出的实例会默认添加 public static final 修饰。

在定义枚举类型时我们使用的关键字是enum,它是Java5中增加的关键字,和class、interface地位相似。它同样也能有属性、方法、构造器(只能使用 private 修饰,省略修饰符也是默认用的private)、也可以实现接口等等。

但是 enum 定义的枚举类默认继承的是 java.lang.Enum 类,而非Object,因此枚举类不能显式的继承其他父类,Enum类实现了 java.lang.Serializable 和 java.lang.Comparable 两个接口。有以下方法:

  • values() 返回枚举类中所有的值。
  • ordinal()方法可以找到每个枚举常量的索引,就像数组索引一样。
  • valueOf()方法返回指定字符串值的枚举常量。
//枚举类型,使用关键字enum,定义周一到周日的常量
public enum Week {
    //不使用枚举需要定义七个常量:private final static String MONDAY = "星期一";.......
    MONDAY("星期一"), TUESDAY("星期二"), WEDNESDAY("星期三"),
    THURSDAY("星期四"), FRIDAY("星期五"), SATURDAY("星六"),
    SUNDAY("星期天");

    //枚举可以作为一个类,添加属性和方法
    //构造方法,默认为 private 修饰
    Week(String name) {
        this.name = name;
    }
    //属性方法
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
public static void main(String[] args) {
    Week week1 = Week.FRIDAY;
    //在switch中使用
    switch (week1){
        case MONDAY: case TUESDAY:   case WEDNESDAY:
        case THURSDAY: case FRIDAY: case SATURDAY:
        case SUNDAY:
            System.out.println(week1.getName());
            break;
        default:
            System.out.println("错误!!");
    }
    System.out.println("-----------分割线-------------");

    //迭代
    for (Week week2:Week.values()) {
        System.out.println(week2.getName());
    }
    System.out.println("-----------分割线-------------");

    //valueOf 通过指定字符串值返回枚举常量。
    Week week3 = Week.valueOf("MONDAY");
    System.out.println(week3.getName());
    System.out.println("-----------分割线-------------");

    //ordinal返回索引位置
    Week week = Week.FRIDAY;
    int ordinal = week.ordinal();
    System.out.println(ordinal);


}

在这里插入图片描述

2.3.2、实现接口

枚举类实现接口和普通类一样,也需要实现接口中的方法。

public interface EnumInterfaceTest {
    void test();
}
public enum EnumImplInterface implements EnumInterfaceTest{
    //测试枚举类实现接口
    ENUM1,
    ENUM2,
    ENUM3,
    ;
    @Override
    public void test() {
		sout
    }
}

在这里插入图片描述

由枚举类来实现接口方法时,每个枚举对象都具有相同的实现方法。如果想让每个枚举对象实现的方法不同,则需要每个枚举对象分别实现该方法。

public enum EnumImplInterface implements EnumInterfaceTest{
    //测试枚举类实现接口
    ENUM1{
        @Override
        public void test() {
            System.out.println("enum1实现的枚举方法");
        }
    },

    ENUM2{
        @Override
        public void test() {
            System.out.println("enum2实现的枚举方法");
        }
    },
    ENUM3{
        @Override
        public void test() {
            System.out.println("enum3实现的枚举方法");
        }
    },
    ;
}

在这里插入图片描述

2.3.3、含抽象方法

枚举类中是可以定义抽象方法的,在定义抽象方法后,枚举类可以不使用 abstract 关键字定义为抽象类,系统会自动为枚举类添加 abstract关键字,因为枚举类需要显式创建枚举值,所以枚举值需要直接实现抽象方法。

public enum calculation {
    //加减乘除
    //需要直接实现抽象方法,否则出现编译错误
    Add{
        @Override
        public int test(int num1,int num2) {
            return num1+num2;
        }
    },
    subtract{
        @Override
        public int test(int num1,int num2) {
            return num1-num2;
        }
    },
    multiply{
        @Override
        public int test(int num1,int num2) {
            return num1*num2;
        }
    },
    divide{
        @Override
        public int test(int num1,int num2) {
            if(num2 == 0){
                System.out.println("除数不能为0");
            }{
                return num1/num2;
            }
        }
    };
	//抽象方法
    public abstract int test(int num1,int num2);
}
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐