枚举类

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、小结

  1. 自定义枚举类
    1. 步骤:
      1. 声明枚举类对象的属性,private final修饰
      2. 私有化构造器,有参构造器
      3. 提供当前枚举类的具体对象
      4. 其他诉求:获取当前枚举类对象的属性
      5. 其他诉求:重写 toString()方法
  2. 使用enum关键字
    1. 步骤:
      1. 提供当前枚举类的具体对象,多个对象间用",“隔开,最后用”;"结尾
      2. 声明枚举类对象的属性,private final修饰
      3. 私有化构造器,有参构造器
      4. 其他诉求:获取当前枚举类对象的属性
      5. 其他诉求:重写 toString()方法
  3. 父类Enum的常用方法
    1. value():返回枚举类的对象数组。可以遍历所有枚举值
    2. valueOf(String s):返回对象名为 s 的枚举对象
      若没有对应的对象抛异常IllegalArgumentException
    3. toString():返回当前枚举对象常量的名称
  4. enum的枚举类实现接口
    1. 情况一:实现接口,在enum类中重写接口中的抽象方法
    2. 情况二:让枚举类的对象分别实现接口中的抽象方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值