[Java基础复习] 枚举

介绍

枚举是JDK1.5之后引入的概念,在层级上他和class属于一个层面的。在JDK1.5 之前,我们定义常量都是: public static fianl… 。很难管理。 枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。
举个例子,用于定义有限数量的一组同类常量,例如:
错误级别: 低、中、高、急
一年的四季: 春、夏、秋、冬
在枚举类型中定义的常量是该枚举类型的实例。

枚举的定义格式

权限修饰符 enum 枚举名称 { 
	实例1,实例2,实例3,实例4; 
	other code...
}

注意下面代码中枚举以逗号分隔,分号结尾。枚举的括号内可以不加任何的参数,直接写成LOW, MEDIUM, HIGH也是可以的,参考代码段Level2。

public enum Level { 
	LOW(30), MEDIUM(15), HIGH(7); 

	private int levelValue; 

	private Level(int levelValue) { 
		this.levelValue = levelValue; 
	}

	public int getLevelValue() { 
		return levelValue; 
	}
	
	more code...
}

public enum Level2 { 
	LOW, MEDIUM, HIGH; 

	private Level() { } //注意,这里的构造方法内不再传入int,与枚举保持一致

	more code...
}

枚举类常见方法 Enum

注意枚举类是Enum,而枚举是enum,两个有区别!
在这里插入图片描述

//假设上面代码中的Level与下述代码在同一个包中
//switch方法,直接写枚举名即可,不需要l.LOW
public void switchTest(Level l){
	switch(l){
		case LOW: 
			...
			break;
		case MEDIUM: 
			...
			break;
		case HIGH: 
			...
			break;
		default:
			break;
	}
}

System.out.println(Level.LOW.name()); //打印LOW
System.out.println(Level.LOW.ordinal()); //打印0,ordinal表示序列,所以LOW第一个就是0
System.out.println(Level.LOW.toString()); //打印LOW
System.out.println(Level.LOW.getLevelValue()); //打印30,这个是自建方法
System.out.println(Level.LOW.compareTo(Level.MEDIUM)); //打印-1,这个方法相当于用LOW.ordinal() - MEDIUM.ordinal()

//上面图中的valueOf方法比较特别,他是会返回一个Level的枚举常量。
//而方法的使用是Enum.valueOf(枚举.class,String 你想要的枚举常量的名字)
Level x = Enum.valueOf(Level.class, "HIGH");
System.out.println(x.ordinal()); //打印2,HIGH的序列

枚举实现接口

所有的枚举都继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对象不能再继承其他类。
每个枚举对象,都可以实现自己的抽象方法,举个例子有个抽象类LShow:

//抽象类
public interface LShow{
	void show(); 
}

//各自级别实现自己的show
public enum Level implements LShow{ 
	LOW(30){ 
		@Override 
		public void show(){ System.out.println("我是低级"); } 
	}, MEDIUM(15){ 
		@Override 
		public void show(){ System.out.println("我是中级"); } 
	},HIGH(7){ 
		@Override 
		public void show(){ System.out.println("我是高级"); };
}

注意事项

  1. 一旦定义了枚举,最好不要妄图修改里面的值,除非修改是必要的。
  2. 枚举类默认继承的是java.lang.Enum类而不是Object类
  3. 枚举类不能有子类,因为其枚举类默认被final修饰
  4. 只能有private构造方法,防止外部进行实例化
  5. switch中使用枚举时,直接使用常量名,不用携带类名
  6. 不能定义name属性,因为自带name属性
  7. 不要为枚举类中的属性提供set方法,不符合枚举最初设计初衷。(和第一条一样)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值