前言
该基础知识用例全部来自尚硅谷http://www.atguigu.com/.
枚举类是在jdk1.5的时候出的新特性,就枚举类对我个人的而言就是定义一些有限的状态。比如定义一个返回码的状态,商品的状态等等,还是比较方便的。
定义常量(jdk1.5之前)
在jdk1.5之前,定义常量都是用public static final,而且父类均为Object。
class Season {
// 声明season对象的属性:private final修饰
private final String seasonName;
private final String seasonDesc;
// 私有化类的构造器,并给对象赋值
private Season(String seasonName, String seasonDesc){
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
// 提供枚举对象
public static final Season SPRING = new Season("春天","春天");
public static final Season SUMMER = new Season("夏天","夏天");
public static final Season AUTUMN = new Season("秋天","秋天");
public static final Season WINNER = new Season("冬天","冬天");
public String getSeasonName() {
return seasonName;
}
public String getSeasonDesc() {
return seasonDesc;
}
@Override
public String toString() {
return "Season{" +
"seasonName='" + seasonName + '\'' +
", seasonDesc='" + seasonDesc + '\'' +
'}';
}
}
执行
public class SeasonTest {
public static void main(String[] args) {
Season season = Season.SPRING;
System.out.println(season.toString());
}
}
Season{seasonName='春天', seasonDesc='春天'}
枚举类enum
enum类的出现可以认为是专人干专事,比之前定义常量更方便。不过定义枚举的对象时,多个对象之间用","隔开,末尾用";"结束。
enum Season1{
// 提供当前枚举类的对象,多个对象之间用","隔开,末尾用";"结束
SPRING("春天","春天"),
SUMMER("夏天","夏天"),
AUTUMN("秋天","秋天"),
WINNER ("冬天","冬天");
// 声明season对象的属性
private String seasonName;
private String seasonDesc;
// 私有化类的构造器,并给对象赋值
private Season1(String seasonName, String seasonDesc){
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
// 提供枚举对象
public String getSeasonName() {
return seasonName;
}
public String getSeasonDesc() {
return seasonDesc;
}
}
执行
public class SeasonTest1{
public static void main(String[] args) {
Season1 season1 = Season1.SPRING;
System.out.println("name:"+season1.name());
System.out.println("value:"+season1.ordinal());
System.out.println("toString:"+season1.toString());
}
}
name:SPRING
value:0
toString:SPRING
此处直接输出枚举类的name和ordinal,枚举类给每一个常量都隐式的定义了一个值。从toString的方法中也可以看出enum类并不是继承自Object的。Ctrl+左键toString方法进去,即可看到它的父类Enum

这里不过多的研究它的父类。
实现接口
因为java是遵循单继承原则的,所以enum天生就无法继承其他类,但是可以通过接口方式实现一些方法。
interface show{
void show();
}
enum实现接口
enum Season1 implements show{
// 提供当前枚举类的对象,多个对象之间用","隔开,末尾用";"结束
SPRING("春天","春天"),
SUMMER("夏天","夏天"),
AUTUMN("秋天","秋天"),
WINNER ("冬天","冬天");
// 声明season对象的属性:private final修饰
private String seasonName;
private String seasonDesc;
// 私有化类的构造器,并给对象赋值
private Season1(String seasonName, String seasonDesc){
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
// 提供枚举对象
public String getSeasonName() {
return seasonName;
}
public String getSeasonDesc() {
return seasonDesc;
}
@Override
public void show() {
System.out.println("这是一个季节!");
}
}
测试
public class SeasonTest1{
public static void main(String[] args) {
Season1[] values = Season1.values();
for (Season1 season:values) {
System.out.println(season);
season.show();
}
}
}
此处Season1.values()就是获取到枚举类中所有的对象然后遍历。
SPRING
这是一个季节!
SUMMER
这是一个季节!
AUTUMN
这是一个季节!
WINNER
这是一个季节!
接口的方法都被执行。当然,这种接口实现方式使所有对象都执行相同的操作,其实,有其他实现方式,使每个对象分别实现接口完成自己的定制化(在枚举对象的后面添加"{}",并重写接口的方法)。
enum Season1 implements show{
// 提供当前枚举类的对象,多个对象之间用","隔开,末尾用";"结束
SPRING("春天","春天"){
@Override
public void show() {
System.out.println("季节-春天");
}
},
SUMMER("夏天","夏天"){
@Override
public void show() {
System.out.println("季节-夏天");
}
},
AUTUMN("秋天","秋天"){
@Override
public void show() {
System.out.println("季节-秋天");
}
},
WINNER ("冬天","冬天"){
@Override
public void show() {
System.out.println("季节-冬天");
}
};
// 声明season对象的属性:private final修饰
private String seasonName;
private String seasonDesc;
// 私有化类的构造器,并给对象赋值
private Season1(String seasonName, String seasonDesc){
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
// 提供枚举对象
public String getSeasonName() {
return seasonName;
}
public String getSeasonDesc() {
return seasonDesc;
}
}
再次测试
SPRING
季节-春天
SUMMER
季节-夏天
AUTUMN
季节-秋天
WINNER
季节-冬天
可以,这很面向对象。
这里只做简单的使用讲解。如需深入了解的请移步:
Java中的枚举类型(Enum)详解
https://zhuanlan.zhihu.com/p/51296740
深入理解Java枚举类https://blog.csdn.net/javazejian/article/details/71333103
网友评论