Java 枚举
枚举介绍
什么是枚举?
某些方法所接收的数据必须在固定范围之内的,如方向、性别、季节、日期等。
枚举的定义格式:
// // 注意: 定义枚举类需要用关键字enum
public enum s {
枚举项1, 枚举项2, 枚举项3;
}
示例:限制性别输入
/*
JDK1.5 之前的解决方案:自定义一个类,然后私有化构造函数,在自定义类中创建本类的对象。
class Gender{
String value;
public static final Gender man = new Gender("男");
public static final Gender woman = new Gender("女");
private Gender(String value) {
this.value = value;
}
}
*/
// 枚举类解决方案
enum Gender{
man("男"), woman("女");
String value;
private Gender(String value){
this.value = value;
}
}
class User{
private Gender sex;
String name;
public Gender getSex() {
return sex;
}
public void setSex(Gender sex) {
this.sex = sex;
}
}
public class Test {
public static void main(String[] args) {
User user = new User();
user.name = "狗娃";
user.setSex(Gender.man);
System.out.println("名字:"+user.name+" 性别:"+user.getSex().value);
}
}
枚举的特点:
- 枚举类也是一个特殊的类。
- 枚举值默认的修饰符是 public static final。
- 枚举值是枚举值所属的类的类型,枚举值是指向了本类的对象。
- 枚举值的构造方法默认的修饰符是 private。
- 枚举类可以定义自己的成员变量与成员函数。
- 枚举类可以自定义构造函数,但构造函数的修饰符必须是 private,同时枚举值也需传入相应的参数。
- 枚举类可以存在抽象的方法,但枚举值必须实现抽象方法。
- 枚举值必须位于类的第一个语句。
示例:
public enum Season {
SPRING("春"){
// 如果枚举类中有抽象方法
// 那么在枚举项中必须要全部重写
@Override
public void show() {
System.out.println(this.name);
}
},
SUMMER("夏"){
@Override
public void show() {
System.out.println(this.name);
}
},
AUTUMN("秋"){
@Override
public void show() {
System.out.println(this.name);
}
},
WINTER("冬"){
@Override
public void show() {
System.out.println(this.name);
}
};
public String name;
// 空参构造
// private Season(){}
// 有参构造
private Season(String name){
this.name = name;
}
// 抽象方法
public abstract void show();
}
public class EnumDemo {
public static void main(String[] args) {
// 我们可以通过"枚举类名.枚举项名称"去访问指定的枚举项
System.out.println(Season.SPRING);
System.out.println(Season.SUMMER);
System.out.println(Season.AUTUMN);
System.out.println(Season.WINTER);
// 每一个枚举项其实就是该枚举的一个对象
Season spring = Season.SPRING;
}
}
枚举常用方法
方法名 | 说明 |
---|---|
String name() | 获取枚举项的名称 |
int ordinal() | 返回枚举项在枚举类中的索引值 |
int compareTo(E o) | 比较两个枚举项,返回的是索引值的差值 |
String toString() | 返回枚举常量的名称 |
static <T> T valueOf(Class<T> type,String name) | 获取指定枚举类中的指定名称的枚举值 |
T[] values() | 获得所有的枚举项 |
示例:
package com.example.demo;
enum Season {
SPRING, SUMMER, AUTUMN, WINTER;
}
public class Test {
public static void main(String[] args) {
// String name():获取枚举项的名称
String name = Season.SPRING.name();
System.out.println(name); // SPRING
System.out.println("-----------------------------");
// int ordinal():返回枚举项在枚举类中的索引值
int index1 = Season.SPRING.ordinal();
int index2 = Season.SUMMER.ordinal();
int index3 = Season.AUTUMN.ordinal();
int index4 = Season.WINTER.ordinal();
System.out.println(index1); // 0
System.out.println(index2); // 1
System.out.println(index3); // 2
System.out.println(index4); // 3
System.out.println("-----------------------------");
// int compareTo(E o):比较两个枚举项,返回的是索引值的差值
int result = Season.SPRING.compareTo(Season.WINTER);
System.out.println(result); // -3
System.out.println("-----------------------------");
// String toString():返回枚举常量的名称
String s = Season.SPRING.toString();
System.out.println(s); // SPRING
System.out.println("-----------------------------");
// static <T> T valueOf(Class<T> type,String name):获取指定枚举类中的指定名称的枚举值
Season spring = Enum.valueOf(Season.class, "SPRING");
System.out.println(spring); // SPRING
System.out.println(Season.SPRING == spring); // true
System.out.println("-----------------------------");
// values():获得所有的枚举项
Season[] values = Season.values();
for (Season value : values) {
System.out.println(value);
}
/*
SPRING
SUMMER
AUTUMN
WINTER
*/
}
}
switch
switch 语句适用的数据类型:byte、char、short、int、String、枚举类型
注意:case 语句后跟的枚举值只需单写枚举值即可,不需要再声明该枚举值所属的枚举类。
示例:
enum Season{
spring,summer,autumn,winter;
}
public class Demo {
public static void main(String[] args) {
Season season = Season.spring;
System.out.println(season); // spring
switch(season){
case spring:
System.out.println("春天");
break;
case summer:
System.out.println("夏天");
break;
case autumn:
System.out.println("秋天");
break;
case winter:
System.out.println("冬天");
break;
}
}
}