Java枚举类
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);
}
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)