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() | 返回枚举值在枚举类中的顺序,这个顺序根据枚举值声明的顺序而定 |