1、什么是枚举类:
类的对象是有限个的,且是确定的、不可变的
(比如:星期一到星期天,是固定的不变的常量)
当需要定义一组常量时,建议使用枚举类
若枚举类中只有一个对象常量时,其实就是一种单例模式
2、定义枚举类:
jdk 5 之前需要自定义枚举类,jdk 5 之后有enum
关键字
枚举类对象的属性不可被改动,所以应该是private final
修饰
枚举类private final
修饰的属性应该在构造器中赋值
若枚举类显式的定义了带参数的构造器,则在列出枚举值时也必须对应的传入参数
1、自定义枚举类
自定义枚举类
一年有四个固定的季节,设置四个对象常量表示
步骤:
1、声明枚举类对象的属性,private final修饰
2、私有化构造器,有参构造器
3、提供当前枚举类的具体对象
4、其他诉求:获取当前枚举类对象的属性
5、其他诉求:重写 toString()方法
class Untitled {
public static void main(String[] args) {
System.out.println(Season.SPRING);
}
}
//自定义枚举类
class Season{
//1、声明枚举类对象的属性,private final修饰
private final String name;
private final String mean;
//2、私有化构造器,有参构造器
private Season(String name,Stirng mean){
this.name = name;
this.mean = mean;
}
//3、提供当前枚举类的具体对象
public static final Season SPRING = new Season("春天","春暖花开");
public static final Season SUMMER = new Season("夏天","夏日炎炎");
public static final Season AUTUMN = new Season("秋天","秋高气爽");
public static final Season WINTER = new Season("冬天","冬雪皑皑");
//4、其他诉求:获取当前枚举类对象的属性
public String getName(){return name;}
public String getMean(){return mean;}
//5、其他诉求:重写 toString()方法
public String toString(){
return "Season{"+ name +':'+ mean +'}';
}
}
执行结果如下
2、使用enum关键字定义枚举类
enum
关键字是和class、interface并列的存在
enum
关键字的枚举类默认继承于Enum
对象
Enum
对象中已经重写了toString()
方法,所以子类中可以不重写该方法
步骤:
1、提供当前枚举类的具体对象,多个对象间用",“隔开,最后用”;"结尾
2、声明枚举类对象的属性,private final修饰
3、私有化构造器,有参构造器
4、其他诉求:获取当前枚举类对象的属性
5、其他诉求:重写 toString()方法
class Untitled {
public static void main(String[] args) {
System.out.println(Season.SPRING);
//查看父类对象 java.langEnum
System.out.println(Season.class.getSuoerclass());
}
}
//enum关键字定义枚举类
enum Season{
//1、提供当前枚举类的具体对象,多个对象间用","隔开,最后用";"结尾
SPRING = ("春天","春暖花开"),
SUMMER = ("夏天","夏日炎炎"),
AUTUMN = ("秋天","秋高气爽"),
WINTER = ("冬天","冬雪皑皑");
//2、声明枚举类对象的属性,private final修饰
private final String name;
private final String mean;
//3、私有化构造器,有参构造器
private Season(String name,Stirng mean){
this.name = name;
this.mean = mean;
}
//4、其他诉求:获取当前枚举类对象的属性
public String getName(){return name;}
public String getMean(){return mean;}
//5、其他诉求:重写 toString()方法
// public String toString(){
// return "Season{"+ name +':'+ mean +'}';
// }
}
3、父类Enum的常用方法
value()
:返回枚举类的对象数组。可以遍历所有枚举值
根据上面季节的例子
class Untitled {
public static void main(String[] args) {
//value():可以用来遍历枚举类中的对象常量
Season[] v = Season.value();
for(int i = 0; i < v.length; i ++){
System.out.println(v[i]);
}
}
}
在学习多线程的过程中,查看Thread
类的源码,可以看到线程的生命周期State
就是定义为一个枚举类,此处可以遍历线程的多个生命周期状态
class Untitled {
public static void main(String[] args) {
Thread.State[] s = Thread.State.value();
for(int i = 0; i < s.length; i ++){
System.out.println(s[i]);
}
}
}
valueOf(String s)
:可以返回对象名为 s 的枚举对象。若未找到与 s 同名的对象,抛异常IllegalArgumentException
toString()
:返回当前枚举对象常量的名称
根据上面季节的例子
class Untitled {
public static void main(String[] args) {
//valueOf(String s):返回对象名为 s 的枚举对象
Season su = Season.valueOf("SUMMER");
//toString()
System.out.println(su);
//抛异常:IllegalArgumentException
//Season su = Season.valueOf("SUMMER111");
}
}
还有其他方法:
4、枚举类实现接口
这里具体说明的是关键字enum
定义的枚举类实现接口的情况。
因为对于自定义的枚举类,前面的关键词还是class
,所以实现接口还是正常实现接口
情况一: 实现接口,在enum
类中重写接口中的抽象方法
这种情况下,每个对象去调用重写的方法,都是一个执行结果,因为是同一个方法
class Untitled {
public static void main(String[] args) {
//调用重写接口的方法,非静态方法通过对象调用
//不同对象调用结果一样
Season ss = Season.valueOf("SPRING");
ss.show();
Season ww = Season.valueOf("WINTER");
ww.show();
}
}
interface AA{
void show();
}
enum Season implements AA{
//1、提供当前枚举类的具体对象,多个对象间用","隔开,最后用";"结尾
SPRING = ("春天","春暖花开"),
SUMMER = ("夏天","夏日炎炎"),
AUTUMN = ("秋天","秋高气爽"),
WINTER = ("冬天","冬雪皑皑");
//2、声明枚举类对象的属性,private final修饰
private final String name;
private final String mean;
//3、私有化构造器,有参构造器
private Season(String name,Stirng mean){
this.name = name;
this.mean = mean;
}
//4、其他诉求:获取当前枚举类对象的属性
public String getName(){return name;}
public String getMean(){return mean;}
//重写方法
public void show(){
System.out.println("季节");
}
}
想要每个对象调用重写方法之后,可以输出不同的结果
情况二: 让枚举类的对象分别实现接口中的抽象方法
在提供枚举类对象的时候,再后面重写接口的抽象方法
class Untitled {
public static void main(String[] args) {
Season[] v = Season.value();
for(int i = 0; i < v.length; i ++){
System.out.println(v[i]);
v[i].show();
}
}
}
interface AA{
void show();
}
enum Season implements AA{
//1、提供当前枚举类的具体对象,多个对象间用","隔开,最后用";"结尾
SPRING = ("春天","春暖花开"){
public void show(){
System.out.println("春天春天");
}
},
SUMMER = ("夏天","夏日炎炎"){
public void show(){
System.out.println("夏天夏天");
}
},
AUTUMN = ("秋天","秋高气爽"){
public void show(){
System.out.println("秋天秋天");
}
},
WINTER = ("冬天","冬雪皑皑"){
public void show(){
System.out.println("冬天冬天");
}
};
//2、声明枚举类对象的属性,private final修饰
private final String name;
private final String mean;
//3、私有化构造器,有参构造器
private Season(String name,Stirng mean){
this.name = name;
this.mean = mean;
}
//4、其他诉求:获取当前枚举类对象的属性
public String getName(){return name;}
public String getMean(){return mean;}
}
5、小结
- 自定义枚举类
- 步骤:
- 声明枚举类对象的属性,private final修饰
- 私有化构造器,有参构造器
- 提供当前枚举类的具体对象
- 其他诉求:获取当前枚举类对象的属性
- 其他诉求:重写 toString()方法
- 步骤:
- 使用enum关键字
- 步骤:
- 提供当前枚举类的具体对象,多个对象间用",“隔开,最后用”;"结尾
- 声明枚举类对象的属性,private final修饰
- 私有化构造器,有参构造器
- 其他诉求:获取当前枚举类对象的属性
- 其他诉求:重写 toString()方法
- 步骤:
- 父类Enum的常用方法
value()
:返回枚举类的对象数组。可以遍历所有枚举值valueOf(String s)
:返回对象名为 s 的枚举对象
若没有对应的对象抛异常IllegalArgumentException
toString()
:返回当前枚举对象常量的名称
- enum的枚举类实现接口
- 情况一:实现接口,在
enum
类中重写接口中的抽象方法 - 情况二:让枚举类的对象分别实现接口中的抽象方法
- 情况一:实现接口,在