枚举的一些特质:
- 枚举类中所有的实例都使用public static final修饰,都只能在枚举类的第一行显示列出,否则这个枚举类永远不能产生实例;
- 通过private将构造器隐藏起来,构造器省略访问控制符则默认用private;
- 枚举类默认继承java.lang.Enum,而不是继承Object类,其中java.lang.Enum类实现了java.lang.Serializable和java.lang.Comparable两个接口;
- 使用enum定义、非抽象的的枚举类默认使用final修饰,故不能派生子类;
通过.values()遍历枚举值、toString()和name()获取实例名称,compareTo()比较顺序(相差多少返回多少),ordinal()返回所在顺序;
public class Test {
public static void main(String[] args) {
for(SeanEnum en : SeanEnum.values()) {
System.out.println(en);
}
System.out.println();
System.out.println(SeanEnum.spring.name());//输出spring
System.out.println(SeanEnum.spring.compareTo(SeanEnum.summer));//输出-1
System.out.println(SeanEnum.winter.ordinal());//输出3
}
}
enum SeanEnum {
spring,summer,fall,winter;
}
枚举类的实例,只能是枚举值,不能随意通过new来创建枚举类对象。
public class Test {
public static void main(String[] args) {
//SeanEnum e = Enum.valueOf(SeanEnum.class, "spring");
SeanEnum ee = SeanEnum.valueOf("spring");
System.out.println(ee.getName());
}
}
enum SeanEnum {
spring("春天"),summer("夏天"),fall("秋天"),winter("冬天");
private final String name;
private SeanEnum(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
}
/*
* 上述代码其实是通过构造器创建枚举对象,与如下代码相等;
* public static final SeanEnum spring = new SeanEnum("春天");
*
*/
枚举类实现接口,可对不同的枚举类实现不同的方法:
public class Test {
public static void main(String[] args) {
//SeanEnum e = Enum.valueOf(SeanEnum.class, "spring");
SeanEnum ee = SeanEnum.valueOf("spring");
System.out.println(ee.getName());
ee.info();
}
}
interface Sean{
void info();
}
enum SeanEnum implements Sean{
spring("春天"){//通过匿名内部子类创建实例
public void info() {
System.out.println("我是春天");
}
}
,summer("夏天"){
public void info() {
System.out.println("我是夏天");
}
}
,fall("秋天"){
public void info() {
System.out.println("我是秋天");
}
}
,winter("冬天"){
public void info() {
System.out.println("我是冬天");
}
};
private final String name;
private SeanEnum(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
}
包含抽象方法的枚举类:
public class Test {
public static void main(String[] args) {
//SeanEnum e = Enum.valueOf(SeanEnum.class, "spring");
SeanEnum ee = SeanEnum.valueOf("spring");
System.out.println(ee.getName());
System.out.println(ee.info("开心"));
}
}
enum SeanEnum{
spring("春天"){//通过匿名内部子类创建实例
public String info(String moon) {
// TODO Auto-generated method stub
return "我是春天: " + "所以我很" + moon;
}
}
,summer("夏天"){
public String info(String moon) {
// TODO Auto-generated method stub
return "我是夏天: " + "所以我很" + moon;
}
}
,fall("秋天"){
public String info(String moon) {
// TODO Auto-generated method stub
return "我是秋天: " + "所以我很" + moon;
}
}
,winter("冬天"){
public String info(String moon) {
// TODO Auto-generated method stub
return "我是冬天: " + "所以我很" + moon;
}
};
public abstract String info(String moon);
private final String name;
private SeanEnum(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
}
枚举类定义抽象方法时,不能用abstract关键字定义枚举类为抽象类,(系统会自动为它添加);