Java学习笔记——新特性-枚举
1 自定义枚举类
class Season implements Info{
//1. 类的属性,声明为private final,因为枚举类对象的属性不应允许被改动
private final String name;
private final String desc;
//2. 声明为final的属性,在构造器中初始化
private Season(String name, String desc) {
super();
this.name = name;
this.desc = desc;
}
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
//4.创建枚举类的对象:将类的对象声明为public static final。可重写类中的方法。
public static final Season SPRING = new Season("spring", "春暖花开") {
public void show(){
System.out.println("春天在哪里?");
}
};
public static final Season SUMMER = new Season("summer", "夏日炎炎") {
public void show(){
System.out.println("生如夏花");
}
};
public static final Season AUTUMN = new Season("autumn", "秋高气爽") {
public void show(){
System.out.println("秋天是用来分手的季节");
}
};
public static final Season WINTER = new Season("winter", "白雪皑皑") {
public void show(){
System.out.println("冬天里的一把火");
}
};
@Override
public String toString() {
return "Season [name=" + name + ", desc=" + desc + "]";
}
// 必须实现接口中的所有方法
@Override
public void show() {
System.out.println("这是一个季节");
}
}
interface Info{
void show();
}
核心在于将属性用final修饰(属性可选),将构造器用private,并且其成员中有若干个 public static final 的对象。
public class TestSeason {
public static void main(String[] args) {
Season spring = Season.SPRING;
Season summer = Season.SUMMER;
Season autumn = Season.AUTUMN;
Season winter = Season.WINTER;
System.out.println(spring);
spring.show();
System.out.println(summer);
summer.show();
System.out.println(autumn);
autumn.show();
System.out.println(winter);
winter.show();
}
}
2 使用enum定义枚举类
enum SeasonEnum implements Info{
// 枚举对象必须在一开始声明,并且可以省略掉一些重复的修饰符
SPRING("spring", "春暖花开"){
@Override
public void show(){
System.out.println("春天在哪里?");
}
},
SUMMER("summer", "夏日炎炎"){
@Override
public void show(){
System.out.println("生如夏花");
}
},
AUTUMN("autumn", "秋高气爽"){
@Override
public void show() {
System.out.println("秋天是用来分手的季节");
}
},
WINTER("winter", "白雪皑皑"){
@Override
public void show() {
System.out.println("冬天里的一把火");
}
};
private final String name;
private final String desc;
private SeasonEnum(String name, String desc) {
this.name = name;
this.desc = desc;
}
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
@Override
public String toString() {
return "Season [name=" + name + ", desc=" + desc + "]";
}
// 当所有枚举对象都实现了接口中的方法,则枚举类中不必实现
// @Override
// public void show() {
// System.out.println("这是一个季节");
// }
}
使用enum关键字进行定义枚举类,则可以省略一些重复的代码,使代码更简洁。
枚举类和普通类的区别:
- 枚举对象值必须在一开始就声明,并且以 ‘,’ 分隔,以 ‘;’ 结尾
- 枚举类的构造器只能使用 private 访问控制符
- 若所有的枚举对象都实现了接口中的方法,则枚举类中不必实现(即若枚举类中没有实现接口中的方法,则必须在所以枚举对象中实现)
- 若枚举类存在无参构造器,则声明枚举对象时可以省略括号
- 存在一些已经事先定义好的方法
一个更简单的例子:
// Java源代码中Thread中的一个内部类State
public enum State {
NEW,
RUNNABLE,
BLOCKED,
WAITING,
TIMED_WAITING,
TERMINATED;
}
JDK 1.5 中可以在 switch 表达式中使用Enum定义的枚举类的对象作为表达式,case 子句可以直接使用枚举值的名字,无需添加枚举类作为限定。
3 枚举类的主要方法
-
values()
返回枚举类型的对象数组。该方法可以很方便地遍历所有的枚举值。
SeasonEnum[] seasons = SeasonEnum.values(); for (int i = 0; i < seasons.length; i++) { System.out.println(seasons[i]); }
-
valueOf(String str)
可以把一个字符串转为对应的枚举类对象。要求传入的字符串必须是枚举类对象的“名字”。如不是,会有运行时异常。
SeasonEnum season = SeasonEnum.valueOf("SPRING"); System.out.println(season); // 其他方法 System.out.println(season.name()); // 得到当前枚举常量的名称 System.out.println(season.ordinal()); // 得到当前枚举常量的次序
以上笔记参考自尚硅谷