一、枚举
说明:即把具体的对象一个一个的列举出来的类就称为枚举类
- 枚举是一组常量集合(enumeration)
- 里面只包含了一组有限的特定的对象
1.枚举的实现
1.1用户自定义的实现
步骤
- 不需要提供setXxx方法,因为枚举对象值通常为只读
- 对枚举对象/属性使用 final + static 共同修饰,实现底层优化
- 枚举对象名通常使用全部大写,常量命名规范
- 枚举对象根据需要,也可以有多个属性
小结:进行自定义类实现枚举
- 构造器私有化
- 本类创建一组对象
- 对外暴露对象
- 可以提供get方法,但不要提供set
package com.hspedu.enum_;
/**
* @author DL5O
* @version 1.0
*/
public class Enumeration02 {
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);
}
}
/*
演示自定义枚举实现
*/
class Season_{
private String name;
private String desc;//描述
//1.将构造器私有化,目的防止直接new
//2.去掉set相关的方法,目的防止属性被修改
//3.在Season_内部,创建固定的对象
//拥有固定的四个对象
//优化一下加入final关键字,让他为常量
public final static Season_ SPRING = new Season_("春天", "温暖");
public final static Season_ WINTER = new Season_("冬天", "寒冷");
public final static Season_ AUTUMN = new Season_("秋天", "凉爽");
public final static Season_ SUMMER = new Season_("夏天", "炎热");
private Season_(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 + '\'' +
'}';
}
}
1.2使用enum关键字实现枚举
-
当我们使用 enum 关键字开发一个枚举类时,默认会继承 Enum 类, 而且是一个final类
-
传统的
public static final Season2 SPRING = new Season2("春天", "温暖");
简化成SPRING("春天", "温暖")
, 这里必须知道,它调用的是哪个构造器 -
如果使用无参构造器创建枚举对象,则实参列表和小括号都可以省略
-
当有多个枚举对象时,使用
,
间隔,最后有一个分号结尾 -
枚举对象必须放在枚举类的行首
package com.hspedu.enum_;
/**
* @author DL5O
* @version 1.0
*/
public class Enumeration03 {
public static void main(String[] args) {
System.out.println(Season2.SPRING);
System.out.println(Season2.SUMMER);
}
}
enum Season2{
//使用enum 来实现枚举类
//1. 使用关键字 enum 替代 class
//2. public final static Season_ SPRING = new Season_("春天", "温暖");
// 直接使用 SPRING("春天","温暖"); 进行替代 常量名(实参列表) 等价了前面这句话
//3. 如果有多个常量(对象),使用 "," 间隔即可
//4. 如果使用enum 来实现枚举,要求将定义常量写在最前面
//5. 如果我们使用的是无参构造器,创建常量对象,则可以省略()
SPRING("春天","温暖"), WINTER("冬天","寒冷"),
AUTUMN("秋天","凉爽"),SUMMER("夏天","炎热"),
What;
private String name;
private String desc;//描述
private Season2() {
}
private Season2(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 + '\'' +
'}';
}
}
2.Enum成员方法
-
toString:Enum 类已经重写过了,返回的是当前对象 名,子类可以重写该方法,用于返回对象的属性信息
-
name:返回当前对象名(常量名),子类中不能重写
-
ordinal:返回当前对象的位置号,默认从 0 开始
-
values:返回当前枚举类中所有的常量
-
valueOf:将字符串转换成枚举对象,要求字符串必须 为已有的常量名,否则报异常!
-
compareTo:比较两个枚举常量,比较的就是编号!
package com.hspedu.enum_;
/**
* @author DL5O
* @version 1.0
* 演示Enum类的各种方法的使用
*/
public class EnumExercise {
public static void main(String[] args) {
//使用Season3 枚举类,来演示各种方法
Season3 autumn = Season3.AUTUMN;
//name 得到枚举对象的名称
System.out.println(autumn.name());//AUTUMN
//ordinal()输出的是该枚举对象的次序,从0开始编号的
//因此autumn是第三个,因此输出2
System.out.println("序号:"+autumn.ordinal());//2,编号
//values,返回一个数组就Season2[],
//含有定义的所有枚举对象
Season3 [] values = Season3.values();
System.out.println("====遍历取出枚举对象(增强for)====");
for (Season3 season:values){//整强for循环
System.out.println(season);
}
/*
补充增强for循环
int[] nums = {1,4,6};
//传统写法
System.out.println("====普通for循环====");
for (int i = 0; i < nums.length; i++) {
System.out.println(nums[i]);
}
//增强for循环
System.out.println("====增强for循环====");
for (int i : nums) {
//执行流程,依次从数组nums中取出数据,赋给i,
//如果取出完毕,则退出for循环
System.out.println("i=" + i);
}
*/
// valueOf:将字符串转换成枚举对象,要求字符串必须为已有的常量名,
// 否则报异常!
//1. 根据你输入的 "AUTUMN" 到Season3的枚举对象中去找到
//2. 如果找到了就返回,没有找到就报错
Season3 autumn1= Season3.valueOf("AUTUMN");
System.out.println("autumn1=" + autumn1);
System.out.println(autumn == autumn1);
//compareTo
//1.就是把AUTUMN的编号和SUMMER对象的编号进行比较
//2.用AUTUMN的编号(2) - SUMMER的编号(3) = -1
System.out.println(Season3.AUTUMN.compareTo(Season3.SUMMER));//-1
System.out.println(Season3.SUMMER.compareTo(Season3.AUTUMN));//1
}
}
enum Season3 {
//使用enum 来实现枚举类
//1. 使用关键字 enum 替代 class
//2. public final static Season_ SPRING = new Season_("春天", "温暖");
// 直接使用 SPRING("春天","温暖"); 进行替代 常量名(实参列表) 等价了前面这句话
//3. 如果有多个常量(对象),使用 "," 间隔即可
//4. 如果使用enum 来实现枚举,要求将定义常量写在最前面
//5. 如果我们使用的是无参构造器,创建常量对象,则可以省略()
SPRING("春天", "温暖"), WINTER("冬天", "寒冷"),
AUTUMN("秋天", "凉爽"), SUMMER("夏天", "炎热");
private String name;
private String desc;//描述
private Season3(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 "Season3{" +
"name='" + name + '\'' +
", desc='" + desc + '\'' +
'}';
}
}
练习
声明 Week 枚举类,其中包含星期一至星期日的定义; MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY,
package com.hspedu.enum_;
/**
* @author DL5O
* @version 1.0
*/
public class EnumExercise02 {
public static void main(String[] args) {
Week[] week = Week.values();
System.out.println("==所有信息如下==");
for (Week day : week) {
System.out.println(day);
}
}
}
enum Week{
MONDAY("星期一"),TUESDAY("星期二"),WEDNESDAY("星期三"),
THURSDAY("星期四"),FRIDAY("星期五"),SATURDAY("星期六"),
SUNDAY("星期日");
private String day;
private Week(String day) {
this.day = day;
}
public String getDay() {
return day;
}
@Override
public String toString() {
return day;
}
}
3.使用细节和注意事项
-
使用 enum 关键字后,就不能再继承其它类了,因为 enum 会隐式继承 Enum,而 Java 是单继承继承
-
枚举类和普通类一样,可以实现接口,如下形式
enum 类名 implements 接口1,接口2{ } package com.hspedu.enum_; /** * @author DL5O * @version 1.0 */ public class EnumDetail { public static void main(String[] args) { Music.CLASSICMUSIC.Playing(); } } class A{ } //1.使用 enum 关键字后,就不能再继承其它类了, // 因为 enum 会隐式继承 Enum,而 Java 是单继承机制 /* enum Season4 extend A{ } */ //2.enum类仍然是个类,所以还是可以实现接口的 interface IPlaying{ public void Playing(); } enum Music implements IPlaying{ CLASSICMUSIC;//==> public final Music CLASSICMUSIC = new Music(); @Override public void Playing() { System.out.println("播放好听的音乐.."); } }