什么是Enum?
- Enum(枚举)。
- 枚举是一种规范它规范了参数的形式,这样就可以不用考虑类型的不匹配并且显的替代了int 型参数可能带来的模糊概念,枚举像一个类,又像一个数组。
- 它不能有public的构造函数,这样做可以保证客户代码没有办法新建一个enum的实例。
- 所有枚举值都是public , static , final的。注意这一点只是针对于枚举值,我们可以和在普通类里面定义 变量一样定义其它任何类型的非枚举变量,这些变量可以用任何你想用的修饰符。
- Enum默认实现了 java.lang.Comparable接口。
- Enum覆载了
toString()
方法,因此我们如果调用ColorEnum.RED.toString()
则默认返回字符串 "RED"。 - Enum提供了一个
valueOf()
方法,这个方法和toString()
方法是相对应的。调用valueOf("RED")
则会默认返回ColorEnum.RED
因此我们在自己重写toString()
方法的时候就要注意到这一点,一搬来说也会相对应地重写valueOf()
方法。 - 在比较两个枚举类型的值时,永远不需要调用equals方法,而直接使用"=="就可以了。(
equals()
方法也是直接使用 == , 两者是一样的效果)
Enum常见的方法
Enum是所有 Java 语言枚举类型的公共基本类(注意Enum是抽象类),以下是它的常见方法:
- compareTo(Enum e) 返回类型为 int 比较此枚举与指定对象的顺序
public enum EnumDemoOne { RED, GREEND, BLANK, YELLOW } public class EnumTestOne { public static void main(String[] args){ System.out.println("比较此枚举与指定对象的顺序 为正则是大于对比下标位置序多少,为负则是小于他对比下标位置多少"); System.out.println("YELLOW 对比 RED 位置顺序结果为:" + EnumDemoOne.YELLOW.compareTo(enumDemoOne)); System.out.println("RED 对比 YELLOW 位置顺序结果为:" + EnumDemoOne.RED.compareTo(EnumDemoOne.YELLOW)); /** * 比较此枚举与指定对象的顺序 为正则是大于对比下标位置序多少,为负则是小于他对比下标位置多少 * YELLOW 对比 RED 位置顺序结果为:3 * RED 对比 YELLOW 位置顺序结果为:-3 */ }} 复制代码
- equals(Object other) 返回类型 boolean 当指定对象等于此枚举常量时,返回true。
public enum EnumDemoOne { RED, GREEND, BLANK, YELLOW } public class EnumTestOne { EnumDemoOne enumDemoOne = EnumDemoOne.RED; public static void main(String[] args){ System.out.println("当指定对象等于此枚举常量时,返回 true。"); System.out.println("RED.toString() 对等于 RED.toString() 时" + EnumDemoOne.RED.toString().equals(enumDemoOne.toString())); System.out.println("RED 对等于 RED 时" + EnumDemoOne.RED.equals(enumDemoOne)); System.out.println("YELLOW 对等于 BLANK 时" + EnumDemoOne.YELLOW.equals(EnumDemoOne.BLANK)); System.out.println("YELLOW.name() 对等于 BLANK.name() 时" + EnumDemoOne.YELLOW.name().equals(EnumDemoOne.BLANK.name())); /** * 当指定对象等于此枚举常量时,返回 true。 * RED.toString() 对等于 RED.toString() 时true * RED 对等于 RED 时true * YELLOW 对等于 BLANK 时false * YELLOW.name() 对等于 BLANK.name() 时false */ } }复制代码
- getDeclaringClass() 返回类型 Class<?> 返回与此枚举常量的枚举类型相对应的 Class 对象
public enum EnumDemoOne { RED, GREEND, BLANK, YELLOW } public class EnumTestOne { EnumDemoOne enumDemoOne = EnumDemoOne.RED; public static void main(String[] args){ System.out.println("返回与此枚举常量的枚举类型相对应的 Class 对象"); System.out.println("RED 的枚举常量相对应的类型是:" + EnumDemoOne.RED.getDeclaringClass()); /** * 返回与此枚举常量的枚举类型相对应的 Class 对象 * RED 的枚举常量相对应的类型是:class com.chenquan.demo.enum_demo.EnumDemoOne */ } }复制代码
- name() 返回类型 String 返回此枚举常量的名称,在其枚举声明中对其进行声明
public enum EnumDemoOne { RED, GREEND, BLANK, YELLOW } public class EnumTestOne { EnumDemoOne enumDemoOne = EnumDemoOne.RED; public static void main(String[] args){ System.out.println("name() 返回此枚举常量的名称,在其枚举声明中对其进行声明\t" + EnumDemoOne.RED.name()); /** * name() 返回此枚举常量的名称,在其枚举声明中对其进行声明 RED */ } }复制代码
- toString() 返回类型 String 返回枚举常量的名称,它包含在声明中。我们在上文中提到:了Enum覆载了
toString()
方法,因此我们如果调用ColorEnum.RED.toString()
则默认返回字符串 "RED"。 可以发现。通过查看源码发现toString()
和name()
方法其实都是返回Enum常量的名字public enum EnumDemoOne { RED, GREEND, BLANK, YELLOW } public class EnumTestOne { EnumDemoOne enumDemoOne = EnumDemoOne.RED; public static void main(String[] args){ System.out.println("toString() 返回枚举常量的名称,它包含在声明中\t" + EnumDemoOne.RED.toString()); /** * toString() 返回枚举常量的名称,它包含在声明中 RED */ } }复制代码
- ordinal() 返回类型 int 返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零) 该方法获取的是枚举变量在枚举类中声明的顺序,下标从0开始 在声明枚举的时候下标就会自己产生。
public enum EnumDemoOne { RED, GREEND, BLANK, YELLOW } public class EnumTestOne { EnumDemoOne enumDemoOne = EnumDemoOne.RED; public static void main(String[] args){ System.out.println("ordinal() 得到枚举类型创建的顺序\t" + EnumDemoOne.RED.ordinal()); System.out.println("ordinal() 得到枚举类型创建的顺序\t" + EnumDemoOne.GREEND.ordinal()); /** * ordinal() 得到枚举类型创建的顺序 0 * ordinal() 得到枚举类型创建的顺序 1 */ } }复制代码
- static valueOf(Class<T> enumType, String name) 静态方法 放回类型 static<T extends Enum<T>> T 返回带指定名称的指定枚举类型的枚举常量。
public enum EnumDemoOne {
RED, GREEND, BLANK, YELLOW
}
public class EnumTestOne {
EnumDemoOne enumDemoOne = EnumDemoOne.RED;
public static void main(String[] args){
System.out.println("得到指定名称的常量名:" + EnumDemoOne.valueOf("RED"));
System.out.println("得到指定名称的常量名:" + EnumDemoOne.valueOf("BLANK"));
System.out.println("得到指定名称的常量名:" + EnumDemoOne.valueOf("YELLOW"));
/**
* 得到指定名称的常量名:RED
* 得到指定名称的常量名:BLANK
* 得到指定名称的常量名:YELLOW
*/
}
}复制代码
Enum一般做什么用?
- 常量
public static final String RED;
有了枚举,就可 以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。
/**颜色*/
public enum ColorEnum{
RED, GREEND, BLANK, YELLOW;
}复制代码
/**星期*/
public enum WeekDayEnum{
MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY;
}复制代码
switch
public enum EnumDemoOne {
RED, GREEND, BLANK, YELLOW;
}
public class EnumTestOne {
EnumDemoOne enumDemoOne = EnumDemoOne.RED;
public void changeSwtich(){
switch (enumDemoOne) {
case RED:
System.out.println(EnumDemoOne.RED + " 这是红色");
break;
case GREEND:
System.out.println(EnumDemoOne.GREEND + " 这是绿色");
break;
case BLANK:
System.out.println(EnumDemoOne.BLANK + " 这是白色");
break;
case YELLOW:
System.out.println(EnumDemoOne.YELLOW + " 这是黄色");
break;
}
}
}复制代码
向enum类添加方法与自定义构造函数
我们可以自己给Enum添加属性和方法。在添加时必须注意一点。必须要在定义完的 枚举后面加上分号;
public enum EnumDemoSecond{
RED("红"), GREEND("绿"), BLANK("白"), YELLOW("黄");
private String description;
// 构造方法
private EnumDemoSecond(String description) {
this.description = description;
}
/** set()方法 private 是为了防止外部随意调用修改*/
private void setDescription(String description){
this.description = description;
}
/** get()方法*/
public String getDescription() {
return description;
}
/**
* 重写 toString() 方法,让他返回的是属性的值
* */
@Override
public String toString() {
return this.description;
}
public static void main(String[] args){
/**
* 在重写 toString() 方法以前,toString() 和 name() 都是返回此枚举常量的名称
* 但是现在重写了 toString()方法。返回的是自己定义的属性名称
* */
for (EnumDemoSecond en : EnumDemoSecond.values()) {
System.out.println("Enum常量名:" + en.name() + "\t Enum的自定义属性名:" + en.toString() );
}
/**
* Enum常量名:RED Enum的自定义属性名:红
* Enum常量名:GREEND Enum的自定义属性名:绿
* Enum常量名:BLANK Enum的自定义属性名:白
* Enum常量名:YELLOW Enum的自定义属性名:黄
*/
}
}复制代码
这是博主第一次开始学着写博客。。 写出了博主目前理解了的 内容。
本文许多内容出自: blog.youkuaiyun.com/javazejian/…
如有理解错误地方请各位大佬指导。