Java基础之枚举
枚举简介:
什么是枚举类?类里面的对象是有限个的,可以给枚举出来(主要是类中对象是有限个)。
JDK1.5之前需要自定义枚举类
JDK 1.5 新增的 enum 关键字用于定义枚举类
若枚举类只有一个成员, 则可以作为一种单例模式的实现方式
一、自定义枚举类:
枚举类对象的属性不应允许被改动, 所以应该使用 private final 修饰
枚举类的使用 private final 修饰的属性应该在构造器中为其赋值
若枚举类显式的定义了带参数的构造器, 则在列出枚举值时也必须对应的传入参数
public class Enum_One { public static void main(String[] args) { EnumSeason es1 = EnumSeason.es1; System.out.println(es1 + "***" + es1.getSeasonName()); EnumSeason es2 = EnumSeason.es2; System.out.println(es2); EnumSeason es3 = EnumSeason.es3; System.out.println(es3); EnumSeason es4 = EnumSeason.es4; System.out.println(es4); } } //定义一个枚举类 class EnumSeason{ //1、提供类的属性,用private final修饰 private final String seasonName; private final String seasonDesc; //为private final的属性,需要在构造函数中初始化 private EnumSeason(String seasonName, String seasonDesc) { this.seasonName = seasonName; this.seasonDesc = seasonDesc; } //通过公共方法调用属性 public String getSeasonName() { return seasonName; } public String getSeasonDesc() { return seasonDesc; } @Override public String toString() { return "EnumSeason{" + "seasonName='" + seasonName + '\'' + ", seasonDesc='" + seasonDesc + '\'' + '}'; } //内部创建枚举类的对象,对象在类的内部已经确定好了,外部只能调用 public static final EnumSeason es1 = new EnumSeason("春","春暖花开"); public static final EnumSeason es2 = new EnumSeason("夏","夏日炎炎"); public static final EnumSeason es3 = new EnumSeason("秋","硕果累累"); public static final EnumSeason es4 = new EnumSeason("冬","白雪皑皑"); }
二、Enum枚举类
1、必须在枚举类的第一行声明枚举类对象。
枚举类和普通类的区别:
使用 enum 定义的枚举类默认继承了 java.lang.Enum 类
枚举类的构造器只能使用 private 访问控制符
枚举类的所有实例必须在枚举类中显式列出(, 分隔 ; 结尾). 列出的实例系统会自动添加 public static final 修饰
JDK 1.5 中可以在 switch 表达式中使用Enum定义的枚举类的对象作为表达式, case 子句可以直接使用枚举值的名字, 无需添加枚举类作为限定
2、枚举类的主要方法:
values()方法:返回枚举类型的对象数组。该方法可以很方便地遍历所有的枚举值。
valueOf(String str):可以把一个字符串转为对应的枚举类对象。要求字符串必须是枚举类对象的“名字”。如不是,会有运行时异常。
3、和普通 Java 类一样,枚举类可以实现一个或多个接口 若需要每个枚举值在调用实现的接口方法呈现出不同的行为方式, 则可以让每个枚举值分别来实现该方法。
public class Enum_Two { public static void main(String[] args) { EnSeason es1 = EnSeason.SPRING; System.out.println(es1 + "***" + es1.getSeasonName()); EnSeason es2 = EnSeason.SUMMER; System.out.println(es2); EnSeason es3 = EnSeason.AUTUMN; System.out.println(es3); EnSeason es4 = EnSeason.WINTER; System.out.println(es4); //该方法可以把所有对象,以数组的形式返回 EnSeason[] values = EnSeason.values(); for (EnSeason value : values) { System.out.println(value); } //该方法,返回字符串所对应的对象,要求传入的字符串,必须对应是枚举对象的名字, // 或者报java.lang.IllegalArgumentException非法异常 String str = "SPRING"; EnSeason enSeason = EnSeason.valueOf(str); System.out.println(enSeason); //线程里面state是个枚举类,显示不同的状态,线程的生命周期 Thread.State[] states = Thread.State.values(); for (Thread.State state : states) { System.out.println(state); } //枚举类的对象调用实现接口后,重写的方法 // es1.fun(); //实现每个枚举类的对象,调用实现接口所重写的方法,能够不一样 //相当于每个对象都重写抽象方法了 es1.fun(); es2.fun(); es3.fun(); es4.fun(); } } interface Info{ public void fun(); } //关键字enum定义枚举 //枚举类也可以实现接口 enum EnSeason implements Info{ SPRING("春","春暖花开"){ public void fun(){ System.out.println("春暖花开"); } }, SUMMER("夏","夏日炎炎"){ public void fun(){ System.out.println("夏日炎炎"); } }, AUTUMN("秋","硕果累累"){ public void fun(){ System.out.println("硕果累累"); } }, WINTER("冬","白雪皑皑"){ public void fun(){ System.out.println("白雪皑皑"); } }; private final String seasonName; private final String seasonDesc; private EnSeason(String seasonName, String seasonDesc) { this.seasonName = seasonName; this.seasonDesc = seasonDesc; } public String getSeasonName() { return seasonName; } public String getSeasonDesc() { return seasonDesc; } @Override public String toString() { return "EnumSeason{" + "seasonName='" + seasonName + '\'' + ", seasonDesc='" + seasonDesc + '\'' + '}'; } // @Override // public void fun(){ // System.out.println("这是枚举类实现接口后,重写的方法……"); // } }