Java 枚举类 详解

1、枚举是什么?

  Java中的枚举其实是一种语法糖,在 JDK 1.5之后出现,用来表示固定且有限个的对象。比如一个季节类有春、夏、秋、冬四个对象;一个星期有星期一到星期日七个对象。这些明显都是固定的,且有限个。

2、枚举类和普通类的区别

  ①、使用 enum 定义的枚举类默认继承 java.lang.Enum 类,即枚举类是不能再继承别的类了。而普通类的一般父类默认是 Object

  ②、枚举类的构造器只能使用 private 定义,而普通类的还可以用 public 修饰

  ③、枚举类的所有实例必须在枚举类中显示列出(,分隔   ;结尾),列出的实例系统会默认自动添加 public static final 修饰

  ④、所有的枚举类都提供了一个 values() 方法,可以用来遍历枚举值

3、怎么用枚举?

   首先我们看,以一个季节类有春、夏、秋、冬四个对象为例:在 JDK 1.5以前是怎么表示的呢?

   创建一个 季节类:

public class Season {
	//属性不能修改,用 final 修饰
	private final String name;
	private final String desc;
	
	//因为枚举类的对象是有限的,即我们不能再外面 new Season(),所以构造器私有化
	private Season(String name,String desc) {
		this.name = name;
		this.desc = desc;
	}
	
	//不能再外面new Season(),那么内部必须创建出对象
	//外界直接通过类名来访问,用 static 修饰
	//外界不能修改,用 final 修饰
	public static final Season SPRING = new Season("春天", "春暖花开");
	public static final Season SUMMER = new Season("夏天", "炎炎盛夏");
	public static final Season FALL = new Season("秋天", "秋高气爽");
	public static final Season WINTER = new Season("冬天", "大雪纷飞");

	@Override
	public String toString() {
		return "Season [name=" + name + ", desc=" + desc + "]";
	}
	
	
}

  测试:

public class SeasonTest {
	public static void main(String[] args) {
		System.out.println(Season.SPRING);
		System.out.println(Season.SUMMER);
		System.out.println(Season.FALL);
		System.out.println(Season.WINTER);
	}

}

  结果为:

Season [name=春天, desc=春暖花开]
Season [name=夏天, desc=炎炎盛夏]
Season [name=秋天, desc=秋高气爽]
Season [name=冬天, desc=大雪纷飞]

使用 Enum 来表示季节类:

public enum SeasonEnum {

	//必须在第一行写出有哪些枚举值
	SPRING("春天", "春暖花开"),
	SUMMER("夏天", "炎炎盛夏"),
	FALL("秋天", "秋高气爽"),
	WINTER("冬天", "大雪纷飞");
	
	private final String name;
	private final String desc;
	
	private SeasonEnum(String name, String desc) {
		this.name = name;
		this.desc = desc;
	}
	
	
}

  测试:

public static void main(String[] args) {
		
		System.out.println(SeasonEnum.SPRING); //SPRING
		//用 values() 来获取所有的枚举值
		for(SeasonEnum s : SeasonEnum.values()){
			System.out.println(s);
		}
	}

枚举类还能实现接口:

第一步:定义一个接口,方法是返回季节的月份

public interface SeasonEnumImpl {
	//用来返回季节的月份
	String getMonth();

}

第二步:季节类实现接口,并实现接口中的方法

public enum SeasonEnum implements SeasonEnumImpl{

	//必须在第一行写出有哪些枚举值
	SPRING("春天", "春暖花开"){
		@Override
		public String getMonth() {
			return "12-2";
		}
	},
	SUMMER("夏天", "炎炎盛夏"){
		@Override
		public String getMonth() {
			return "3-5";
		}
	},
	FALL("秋天", "秋高气爽"){
		@Override
		public String getMonth() {
			return "6-8";
		}
	},
	WINTER("冬天", "大雪纷飞"){
		@Override
		public String getMonth() {
			return "9-11";
		}
	};
	
	private final String name;
	private final String desc;
	
	private SeasonEnum(String name, String desc) {
		this.name = name;
		this.desc = desc;
	}
}  

测试:

public static void main(String[] args) {
		
		System.out.println(SeasonEnum.SPRING); //SPRING
		
		//用 values() 来获取所有的枚举值
		for(SeasonEnum s : SeasonEnum.values()){
			System.out.println(s.getMonth());
		}
	} 

结果为:

SPRING
12-2
3-5
6-8
9-11

注意:

①、枚举类可以作为 switch--case 的表达式(JDK 1.5以后)

②、如果枚举类的对象只有一个,那么可以作为单例模式的实现

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏学习力

《Java从入门到放弃》JavaSE入门篇:变量

1255
来自专栏企鹅号快讯

从零基础开始学习PHP(六)

发布上一篇博文的时候、不小心忘记添加打赏功能了、这篇文章补上!如文中有误之处、还望大神指出以便改正、也可以更好的帮助后来者学习。 ? PHP中变量的类型 目标 ...

1829
来自专栏JackieZheng

初探JavaScript(四)——作用域链和声明提前

前言:最近恰逢毕业季,千千万万的学生党开始步入社会,告别象牙塔似的学校生活。往往在人生的各个拐点的时候,情感丰富,感触颇深,各种对过去的美好的总结,对未来的展望...

1835
来自专栏自动化测试实战

flask第二十六篇——模板【控制语句】【2】

19210
来自专栏阿凯的Excel

Python读书笔记21(函数与列表)

上期和大家分享了向函数传递列表,今天继续来聊聊通过函数对列表进行操作。 ? 这个函数功能实现了两个列表内容的互换。 假如我们有个成绩列表,将不及格的成绩赋值给新...

3325
来自专栏desperate633

设计模式之装饰者模式(Decorator Pattern)问题提出引出装饰者模式定义装饰者模式实现装饰者模式总结与分析

装饰者模式可以做到在不修改任何底层代码的情况下,给对象增加的新的方法。 首先,我们通过对一个现实问题的模拟分析,了解什么是装饰者模式以及装饰者模式的作用。

794
来自专栏菩提树下的杨过

不伦不类的Action Script 3.0

因工作需要,有可能要接手以前一位Flash程序员同事的代码,今天看了下Action Script 3.0,发现这玩意儿真的有点那个啥... 打开Flash C...

1729
来自专栏coding for love

JS进阶系列03-JS面向对象的三大特征之多态

多态是同一个行为具有多个不同表现形式或形态的能力。在JAVA中,多态通过在子类中重写父类方法去实现。但是在JS中,由于JS本身是动态的,天生就支持多态。大家可以...

802
来自专栏JetpropelledSnake

Python学习笔记之Python的Super方法

1165
来自专栏一个会写诗的程序员的博客

第8章 函数式编程(FP) 《Kotin 编程思想·实战》

8.1 函数式编程概述 8.1.1 面向对象编程OOP特征 8.1.2 函数式编程FP特征

621

扫码关注云+社区