枚举
概述
在某些情况下,一个类的对象是有限而且固定的。例如季节类,只能有 4 个对象
手动实现枚举类:
- private 修饰构造器
- 属性使用 private final 修饰
- 把该类的所有实例都使用 public static final 来修饰
一、使用 enum 定义枚举类
标题枚举类和普通类的区别:
- 使用 enum 定义的枚举类默认继承了 java.lang.Enum 类
- 枚举类的构造器只能使用 private 访问控制符
- 枚举类的所有实例必须在枚举类中显式列出(, 分隔 ; 结尾). 列出的实例系统会自动添加 public static final 修饰
- 所有的枚举类都提供了一个 values 方法, 该方法可以很方便地遍历所有的枚举值
枚举类的属性
枚举类对象的属性不应允许被改动, 所以应该使用 private final 修饰
枚举类使用 private final 修饰的属性应该在构造器中为其赋值
若枚举类显式的定义了带参数的构造器, 则在列出枚举值时也必须对应的传入参数
使用 Enum 定义的 Season
实现接口的枚举类
public class test {
public static void main(String[] args) {
Season spring = Season.SPRING;//相当于调用了一次构造 所以返回值是一个对象
spring.showInof();
Season summer = Season.SUMMER;//执行就是获取一个Season的对象
summer.showInof();
Season spring1 = Season.SPRING;
//每次执行Season.SPRING获得是相同的对象,枚举类中的每个枚举都是单例模式的
System.out.println(spring.equals(spring1));
spring1.test();
}
}
enum Season implements ITest{
//每一次小的枚举相当于调用了Season的构造方法
SPRING("春天","春暖花开"),
SUMMER("夏天","炎炎夏日"),
AUTUMN("秋天","秋高气爽"),
WINTER("冬天","寒风凛冽");
//要写无参构造 要写无参构造不然会报错,不过也可以吧有参构造的参数填进去
//属性私有化
private final String name;
private final String desc;
private Season(String name,String desc){
this.desc = desc;
this.name = name;
}
//再做个普通的public打印信息方法
public void showInof(){
System.out.println(this.name + ": " + this.desc);
}
@Override
public void test() {
System.out.println("这是实现的ITest接口的test方法");
}
}
interface ITest{//接口
void test();
}
//
春天: 春暖花开
夏天: 炎炎夏日
true
这是实现的ITest接口的test方法