文章内容:
- 自定义实现枚举
- 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;}@Overridepublic 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;}@Overridepublic 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;//OKGender2 boy2 = Gender2.BOY;//OKSystem.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);//SPRINGSystem.out.println(spring.name());//SPRINGSystem.out.println(spring.ordinal());//0Season[] values = Season.values();//枚举中的所有类型for (Season season : values) {//SPRING//SUMMERSystem.out.println(season);}Season summerValue = Season.valueOf("SUMMER");System.out.println(summerValue);//SUMMERSystem.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 枚举对象是第一个,因此输出0System.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);//trueSystem.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));//-2Season03[] 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();@Overridepublic void playing() {System.out.println("播放好听的音乐....");}
}