一、什么是枚举
枚举是JDK5新增特性,用来表示一组常量值,比如一年由四个季节,一年中有12个月份,、订单有未付款、已付款、已发货、已收货状态等。
二、枚举的好处
用枚举来表示组常量值,可以避免非法值。
public class Test1 {
public static void main(String[] args) {
Emp emp1 = new Emp("张三", Constants.EMP_GRADE_A);
Emp emp2 = new Emp("李四", Constants.EMP_GRADE_B);
//不能限制住
Emp emp3 = new Emp("李四", 5);
}
}
//常量类
class Constants {
public static final int EMP_GRADE_A = 1;
public static final int EMP_GRADE_B = 2;
public static final int EMP_GRADE_C = 3;
}
//员工类
class Emp{
private String name;
private Integer grade;
public Emp() {
}
public Emp(String name, Integer grade) {
this.name = name;
this.grade = grade;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getGrade() {
return grade;
}
public void setGrade(Integer grade) {
this.grade = grade;
}
public String toString() {
return "Emp{name = " + name + ", grade = " + grade + "}";
}
}
public class Test2 {
public static void main(String[] args) {
Student stu1 = new Student("zhangsan", GradeEnum.A);
//能限制住
// Student stu2 = new Student("zhangsan", 5);
}
}
enum GradeEnum {
A,B,C;
}
class Student{
private String name;
private Enum grade;
public Student() {
}
public Student(String name, Enum grade) {
this.name = name;
this.grade = grade;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Enum getGrade() {
return grade;
}
public void setGrade(Enum grade) {
this.grade = grade;
}
public String toString() {
return "Emp1{name = " + name + ", grade = " + grade + "}";
}
}
三、定义格式
格式:
public enum s {
枚举1,枚举2,枚举3;
}
注:定义枚举要使用关键menu
示例代码:
//定义一个枚举类,用来表示春夏秋冬四个固定值
public menu season{
SPRING,SUMMER,AUTUMN,WINTER;
}
四、枚举的特点
- 所有枚举类都是java.lang.Enum的子类
- 我们可以通过枚举类名.枚举项名称来访问指定的枚举项。
- 每一个枚举项其实就是该枚举的一个对象
- 枚举也是一个类,可以去定义成员变量
- 枚举类的第一行必须是枚举项,最后一个枚举项后的分号是可以省略的,但是如果枚举类有其他的东西,这个分号就不能省略。
- 枚举类可以有构造器,但是必须的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) {
/*
1.所有枚举类都是Enum的子类
2.我们可以通过"枚举类名.枚举项名称"去访问指定的枚举项
3.每一个枚举项其实就是该枚举的一个对象
4.枚举也是一个类,也可以去定义成员变量
5.枚举类的第一行上必须是枚举项,最后一个枚举项后的分号是可以省略的,
但是如果枚举类有其他的东西,这个分号就不能省略。建议不要省略
6.枚举类可以有构造器,但必须是private的,它默认的也是private的。
枚举项的用法比较特殊:枚举("");
7.枚举类也可以有抽象方法,但是枚举项必须重写该方法
*/
//第二个特点的演示
//我们可以通过"枚举类名.枚举项名称"去访问指定的枚举项
System.out.println(Season.SPRING);
System.out.println(Season.SUMMER);
System.out.println(Season.AUTUMN);
System.out.println(Season.WINTER);
//第三个特点的演示
//每一个枚举项其实就是该枚举的一个对象
Season spring = Season.SPRING;
}
}
枚举的方法
public enum Season {
SPRING,SUMMER,AUTUMN,WINTER;
}
public class EnumDemo {
public static void main(String[] args) {
// String name() 获取枚举项的名称
String name = Season.SPRING.name();
System.out.println(name);
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);
System.out.println(index2);
System.out.println(index3);
System.out.println(index4);
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);
System.out.println("-----------------------------");
// static <T> T valueOf(Class<T> type,String name)
// 获取指定枚举类中的指定名称的枚举值
Season spring = Enum.valueOf(Season.class, "SPRING");
System.out.println(spring);
System.out.println(Season.SPRING == spring);
System.out.println("-----------------------------");
// values() 获得所有的枚举项
Season[] values = Season.values();
for (Season value : values) {
System.out.println(value);
}
}
}