文章内容:
- 自定义实现枚举
- enum关键字实现枚举
❤️内容涉及枚举的定义,快速入门,注意事项和小题巩固知识点
🌈 跟着B站一位老师学习的内部类内容,现写这篇文章为学习内部类的小伙伴提供思路支持,希望可以一起感受java的魅力,爱上java编程!!!
1、枚举
1.1介绍
1.1.1、介绍
枚举类【枚:一个一个 举:即把具体的对象一个一个列举出来的类就称为枚举类】
- 枚举对应英文(enumeration,简写:enum)
- 枚举是一组常量的集合[春、夏、秋、冬]
- 可以这里理解:枚举属于一种特殊的类,里面只包含一组有限的特定对象
- final + static不会导致类加载
- 不需要提供setXxx方法,因为枚举对象值通常为只读。
- 对每枚举 对象/属性 使用
final + static
共同修饰,实现底层优化。 - 枚举对象名通常使用全部大写**,常量的命名规范。**
- 枚举对象根据需要,也可以有多个属性
枚举示例(未使用enum形式):
(此时的构造器使用private
修饰,所以不能使用new
的方法进行类的初始化,只能使用类名.静态属性/方法)
代码演示:
package com.fhsedu.enum_;
public class Enumeration02 {
public static void main(String[] args) {
//运行结果见下图
System.out.println(Season.SPRING);
System.out.println(Season.AUTUMN);
System.out.println(Season.SUMMER);
System.out.println(Season.WINTER);
}
}
class Season{
private String name;
private String desc;
public final static Season SPRING = new Season("春天","温暖");
public final static Season SUMMER = new Season("夏天","炎热");
public final static Season AUTUMN = new Season("秋天","凉爽");
public final static Season WINTER = new Season("冬天","寒冷");
//1、将构造器私有化,目的防止 直接 new
//2、去掉setXxx方法,防止属性被修改
//3、在Season 内部,直接创建固定的对象
//4、优化:可以 加入 final修饰符
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.1.2、enum关键字实现枚举
很多情况下,枚举类是不希望进行更改的,但是可以进行获取内容,所以枚举类中只有getXxx
方法,没有setXxx
方法
enum关键字实现枚举,快速入门
语法:
体会和自定义枚举的区别
- 使用普通方法
public final static Season SPRING = new Season("春天","温暖");
public final static Season SUMMER = new Season("夏天","炎热");
public final static Season AUTUMN = new Season("秋天","凉爽");
public final static Season WINTER = new Season("冬天","寒冷");
- 使用枚举方法(有多个枚举使用逗号分隔(,)最后使用分号结尾(;))
SPRING("春天","温暖"), SUMMER("夏天","炎热"),
AUTUMN("秋天","凉爽"), WINTER("冬天","寒冷");
枚举演示
enum Season03{
//如果使用了enum 代替class
//2、public static final Season SPRING =
// new SPRING("春天","温暖");解读 常量名(实参列表)
//3、如果有多个常量(对象) 使用 , 号间隔即可
//4、如果使用enum 来实现枚举,要求将定义常量对象,写在前面
SPRING("春天","温暖"), SUMMER("夏天","炎热"),
AUTUMN("秋天","凉爽"), WINTER("冬天","寒冷");
private String name;
private String desc;//描述
Season03(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 "Season03{" +
"name='" + name + '\'' +
", desc='" + desc + '\'' +
'}';
}
}
1.2、快速入门
- 如果我们使用的是无参构造器,创建常量对象则可以省略
()
SPRING("春天","温暖"),
SUMMER("夏天","炎热"),
AUTUMN("秋天","凉爽"),
WINTER("冬天","寒冷"),WHAT;
private String name;
private String desc;//描述
private Season03(){}
Season03(String name, String desc) {
this.name = name;
this.desc = desc;
}
1.3、enum注意事项
- 当我们使用enum 关键字开发一个枚举类时,默认会继承
Enum
类,而且是一个final
类,使用javap
进行验证
- 传统的
public static final Season2 SPRING = new Season2("春天","温暖");
简化成SPRING("春天","温暖")
,这里必须知道,它调用了那个构造器。- 如果使用无参构造器 创建 枚举对象,则实参列表和小括号都可以省略
- 当有多个枚举对象时,使用 , 间隔,最后有一个分号结尾
- 枚举对象必须放在枚举类的行首
1.4、enum判断是否可行
判断下面的代码是否正确,并说明其含义
解答:
- 上面的语法是可以的
- 有一个枚举类Gender,没有属性
- 有两个枚举对象 BOY,GIRL,使用的无参构造器创建
下列代码输出的内容是什么?
enum
的修饰为:public final static ....
package com.fhsedu.enum_;
/**
* @author fhs
* @version 1.0
*/
public class EnumerationExercise01 {
public static void main(String[] args) {
Gender2 boy = Gender2.BOY;//OK
Gender2 boy2 = Gender2.BOY;//OK
System.out.println(boy);//BOY
/*public String toString() {
return name;
}*/
System.out.println(boy == boy2);//public final static
}
}
enum Gender2{
BOY,GIRL;
}
Enum中底层源代码:
1.5、Enum常用方法
了解Enum的一般常用方法
代码演示
package com.fhsedu;
@SuppressWarnings("all")
public class EnumDemo01 {
public static void main(String[] args) {
Season spring = Season.SPRING;
System.out.println(spring);//SPRING
System.out.println(spring.name());//SPRING
System.out.println(spring.ordinal());//0
Season[] values = Season.values();//枚举中的所有类型
for (Season season : values) {
//SPRING
//SUMMER
System.out.println(season);
}
Season summerValue = Season.valueOf("SUMMER");
System.out.println(summerValue);//SUMMER
System.out.println(spring.compareTo(summerValue));//-1 (spring的位置号 - summerValue的位置号)
}
}
enum Season {
SPRING("春天", "温暖"),
SUMMER("夏天", "炎热");
private String name;
private String describe;
Season(String name, String describe) {
this.name = name;
this.describe = describe;
}
public String getName() {
return name;
}
public String getDescribe() {
return describe;
}
}
对象.ordinal() —>输出对象的序号/编号
- valuesOf用法
//执行流程
//1、根据你输入的 "SPRING" 到 Season03的枚举对象去查找
//2、如果找到了,就返回,如果没有找到,就报错
Season03 spring1 = Season03.valueOf("SPRING");
System.out.println("spring = " + spring1);//对象信息
System.out.println(spring == spring1);//true
如果valueOf(“SPRING”)该对象中没有该信息,就会报错:
没有一个枚举常量
- CompareTo
System.out.println("====compareTo====");
//compareTo:比较两个枚举常量,比较的就是编号
//1、就是把 Season2.AUTUMN 枚举对象的编号和Season03.AUTUMN枚举对象的编号进行比较
//2、看看结果
/*
* public final int compareTo(E o) {
return self.ordinal - other.ordinal;
}
* Season03.SPRING的编号[0] - Season03.AUTUMN[2]的编号
* */
System.out.println(Season03.SPRING.compareTo(Season03.AUTUMN));//-2
所有方法:
package com.fhsedu.enum_;
/**
* @author fhs
* @version 1.0
*/
public class EnumMethod {
public static void main(String[] args) {
//使用Season03 枚举类,来演示各种方法
Season03 spring = Season03.SPRING;
//输出枚举对象的名字
System.out.println(spring.getName());//春天
//ordinal() 输出的是该枚举对象的次序/编号 ,从0开始
//SPRING 枚举对象是第一个,因此输出0
System.out.println(spring.ordinal());//0
//从反编译可以看出 values 方法 返回Season03[]
//含有定义的所有枚举对象
System.out.println(spring.values());
System.out.println("====valuesOf====");
//valueOf:将字符串转换成枚举对象,要求字符串必须为己有的常量名,否则会报异常
//执行流程
//1、根据你输入的 "SPRING" 到 Season03的枚举对象去查找
//2、如果找到了,就返回,如果没有找到,就报错
Season03 spring1 = Season03.valueOf("SPRING");
//Season03中找不到就会报错
// Season03 season031 = Season03.valueOf("FHS");
System.out.println("spring = " + spring1);//对象信息
System.out.println(spring == spring1);//true
System.out.println("====compareTo====");
//compareTo:比较两个枚举常量,比较的就是编号
//1、就是把 Season2.AUTUMN 枚举对象的编号和Season03.AUTUMN枚举对象的编号进行比较
//2、看看结果
/*
* public final int compareTo(E o) {
return self.ordinal - other.ordinal;
}
* Season03.SPRING的编号[0] - Season03.AUTUMN[2]的编号
* */
System.out.println(Season03.SPRING.compareTo(Season03.AUTUMN));//-2
Season03[] season03s = Season03.values();
System.out.println("----遍历取出枚举对象(增强for)----");
for (Season03 season03 : season03s) {//增强for循循环
System.out.println(season03);
}
/*for (Season03 season03 : season03s) {//快捷键 season03.for
}*/
}
}
1.6、enum实现星期打印
package com.fhsedu.enum_;
public class EnumExercise01 {
public static void main(String[] args) {
//获取所有的枚举内容
Week[] weeks = Week.values();
System.out.println("====所有星期的信息如下====");
for (Week week : weeks) {
//将所有的枚举信息输出出来
System.out.println(week.getDay());
}
}
}
enum Week {
//定义Week的枚举对象
MONDAY("星期一"),
TUESDAY("星期二"),
WEDNESDAY("星期三"),
THURSDAY("星期四"),
FRIDAY("星期五"),
SATURDAY("星期六"),
SUNDAY("星期日");
private String day;
private Week(String day) {
this.day = day;
}
public String getDay() {
return day;
}
}
1.7、enum实现接口
- enum不能继承其他类
- 使用enum关键字后,就不能再继承其他类了,因为enum会隐式继承Enum,而java是单继承机制
- 枚举类和普通类一样,可以实现接口,如下形式:
enum 类名 implements 接口1,接口2{}
package com.fhsedu.enum_;
/**
* @author fhs
* @version 1.0
*/
public class EnumDetail {
public static void main(String[] args) {
Music.CLASSMUSIC.playing();
}
}
//1、enum实现的枚举类,仍然是一个类,所以还是可以实现接口的
interface IPlaying {
public void playing();
}
//2、enum本身继承了Enum类,所以不能继承其他类了
enum Music implements IPlaying {
CLASSMUSIC();
@Override
public void playing() {
System.out.println("播放好听的音乐....");
}
}