Java学习笔记-Day20 Java 枚举




枚举类(也可以称为Enum)是一个特定类型的类。它们给出了将一个任意项同另一个项相比较的能力,并且可以在一个已定义项列表中进行迭代。

所有枚举类都是java.lang.Enum的隐式子类,此类不能通过手工进行子类的定义。所有的枚举都继承自java.lang.Enum类,由于Java 不支持多继承,所以枚举对象不能再继承其他类。

枚举类可以实现接口。枚举类的父类java.lang.Enum默认实现了java.lang.Comparable接口。

一、语法

1.1、定义枚举类


(1)枚举类的关键字是enum,访问权限修饰符有public和默认的(不写),类中的所有枚举值都是public、static、final的,即公开静态常量。
在这里插入图片描述
Java代码:

	public enum ColorEnum {
		RED,BLUE,GREEN,YELLOW;
	}

编译后的字节码文件的代码:

public final class ColorEnum extends Enum
{
	public static final ColorEnum RED;
	public static final ColorEnum BLUE;
	public static final ColorEnum GREEN;
	public static final ColorEnum YELLOW;
	private static final ColorEnum ENUM$VALUES[];
	private ColorEnum(String s, int i)
	{
		super(s, i);
	}

	public static ColorEnum[] values()
	{
		ColorEnum acolorenum[];
		int i;
		ColorEnum acolorenum1[];
		System.arraycopy(acolorenum = ENUM$VALUES, 0, acolorenum1 = new ColorEnum[i = acolorenum.length], 0, i);
		return acolorenum1;
	}

	public static ColorEnum valueOf(String s)
	{
		return (ColorEnum)Enum.valueOf(com/chinasofti/train/demo/ColorEnum, s);
	}

	static 
	{
		RED = new ColorEnum("RED", 0);
		BLUE = new ColorEnum("BLUE", 1);
		GREEN = new ColorEnum("GREEN", 2);
		YELLOW = new ColorEnum("YELLOW", 3);
		ENUM$VALUES = (new ColorEnum[] {
			RED, BLUE, GREEN, YELLOW
		});
	}
}

1.2、使用枚举值


在调用ColorEnum的枚举值时,可选值只有四个,否则会出现编译错误,因此可以看出,枚举是类型安全的,不会出现取值范围错误的问题。
在这里插入图片描述

	ColorEnum.GREEN
	ColorEnum.BLUE
	ColorEnum.GREEN
	ColorEnum.YELLOW


使用枚举值的案例:

	public class TestType{	
		public static void main(String[] args) {
			Type t = new Type();
			t.setType(TypeEnum.AUDIO);
			System.out.println(t);//输出   Type [type=AUDIO]
		}
	}
	//Type类
	class Type{
		//TypeEnum类型的属性
		private TypeEnum type;
		//TypeEnum类型的属性的Getter方法
		public TypeEnum getType() {
			return type;
		}
		//TypeEnum类型的属性的Setter方法
		public void setType(TypeEnum type) {
			this.type = type;
		}
		//重写了toString方法
		@Override
		public String toString() {
			return "Type [type=" + type + "]";
		}	
	}
	//枚举类TypeEnum
	enum TypeEnum {
		VEDIO,AUDIO,TEXT,IMAGE;
	}

1.3、 在枚举类中自定义属性和方法


(1)枚举实例必须在前面,需要在枚举实例后面加上分号,然后再写构造函数等。

RED("红色",1),GREEN("绿色",2),WHITE("白色",3),BLACK("黑色",4);

(2)枚举类中可以定义其它任何类型的非枚举变量。

	private String name;
	private int index;

(3)定义枚举的构造方法要带参数(有参构造方法)。在枚举类中也可以写无参构造方法,无参构造方法可有可无,即使不写,Java是默认会提供无参构造方法。枚举类中不能有public的构造方法,构造方法必须为private修饰,不写修饰符默认的也是private修饰的,这样做可以保证客户代码无法新建一个enum的实例。

	private ColorEnum(String name,int index) {
		this.name = name;
		this.index = index;
	}
	//无参构造方法可有可无
	private ColorEnum() {}

Java代码:

public enum ColorEnum {
	RED("红色",1),GREEN("绿色",2),WHITE("白色",3),BLACK("黑色",4);
	
	private String name;
	private int index;
	
	private ColorEnum(String name,int index) {
		this.name = name;
		this.index = index;
	}
	
	private ColorEnum() {}
	
	public String getName() {
		return name;
	}
	public int getIndex() {
		return index;
	}
	
	public static String getName(int index) {
		for(ColorEnum c : ColorEnum.values()) {
			if(c.getIndex() == index) {
				return c.name;
				
			}
		}
		return null;
	}	
}

编译后的字节码文件的代码:

public final class ColorEnum extends Enum
{

	public static final ColorEnum RED;
	public static final ColorEnum GREEN;
	public static final ColorEnum WHITE;
	public static final ColorEnum BLACK;
	private String name;
	private int index;
	private static final ColorEnum ENUM$VALUES[];

	private ColorEnum(String s, int i, String name, int index)
	{
		super(s, i);
		this.name = name;
		this.index = index;
	}

	private ColorEnum(String s, int i)
	{
		super(s, i);
	}

	public String getName()
	{
		return name;
	}

	public int getIndex()
	{
		return index;
	}

	public static String getName(int index)
	{
		ColorEnum acolorenum[];
		int j = (acolorenum = values()).length;
		for (int i = 0; i < j; i++)
		{
			ColorEnum c = acolorenum[i];
			if (c.getIndex() == index)
				return c.name;
		}

		return null;
	}

	public static ColorEnum[] values()
	{
		ColorEnum acolorenum[];
		int i;
		ColorEnum acolorenum1[];
		System.arraycopy(acolorenum = ENUM$VALUES, 0, acolorenum1 = new ColorEnum[i = acolorenum.length], 0, i);
		return acolorenum1;
	}

	public static ColorEnum valueOf(String s)
	{
		return (ColorEnum)Enum.valueOf(com/chinasofti/train/demo/ColorEnum, s);
	}

	static 
	{
		RED = new ColorEnum("RED", 0, "红色", 1);
		GREEN = new ColorEnum("GREEN", 1, "绿色", 2);
		WHITE = new ColorEnum("WHITE", 2, "白色", 3);
		BLACK = new ColorEnum("BLACK", 3, "黑色", 4);
		ENUM$VALUES = (new ColorEnum[] {
			RED, GREEN, WHITE, BLACK
		});
	}
}

二、switch与枚举


switch语句使用枚举,能让我们的代码可读性更强。

	public class TestColor{
		public static void main(String[] args) {
			ColorEnum color = ColorEnum.GREEN;
			switch (color) {
			case RED:
				color = ColorEnum.RED;
				System.out.println(color);
				break;
			case BLUE:
				color = ColorEnum.BLUE;
				System.out.println(color);
				break;		
			case GREEN:
				color = ColorEnum.GREEN;
				System.out.println(color);
				break;
			case YELLOW:
				color = ColorEnum.YELLOW;
				System.out.println(color);
				break;
			default:
				System.out.println("error");
				break;
			}
		}
	}
	enum ColorEnum {
			RED,BLUE,GREEN,YELLOW;
	}

三、枚举的方法


java.lang.Enum类的方法

方法名作用
toString()返回声明中包含的此枚举常量的名称,该方法可以在枚举类中被再一次重写
values()以数组的形式返回枚举类型中的所有成员,能够方便的遍历所有的枚举值
valueOf()将普通字符串转换成枚举实例
compareTo(E o)比较两个枚举成员在定义时的顺序
oridinal()返回枚举值在枚举类中的顺序,这个顺序根据枚举值声明的顺序而定
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值