JAVA基础——枚举

概述

枚举类是一种特殊的类,它可以有自己的成员变量,方法,可以实现一个或多个接口,也可也定义自己的构造器。

枚举类和普通类的区别

  1. 枚举类可以实现一个或多个接口,使用enum定义的枚举类默认继承了java.lang.Enum类,而不是继承Object类,因此枚举不能够显示继承其他父类(单继承局限性,但是可以实现接口)。其中“java.lang.Enum”实现了“Comparable”和“Serializable”接口。
  2. 使用enum定义,非抽象的枚举类默认会使用final修饰,因此枚举类不能够派生子类。
  3. 枚举类的构造器只能够使用private访问控制符,如果省略了构造器的访问控制符,则默认使用private修饰;如果强制指定访问控制符,则只能指定private修饰符。
  4. 枚举类的所有实例必须要在枚举类的第一行显示列出,否则这个枚举类永远都能产生实例。列出这些实时,系统会自动添加public static final修饰符,无需程序员显示添加。
  5. 枚举类默认提供了一个values方法,返回枚举实例数组,该方法可以很方便的遍历所有的枚举值。

枚举类的成员变量、方法和构造器

枚举类也是一种类,只是它是一种比较特殊的类,因此它一样可定义成员变量,方法和构造器。还是上面的一段代码

1
2
3
4
5
6
7
8
9
10
public enum  Season {
//枚举实例,必须要定义在第一行
SPRING("春"),SUMMER("夏"),AUTUMN("秋"),WINTTER("冬");
//定义了成员变量
private String name;
//定义了构造器,默认为private类型,无论是否显示修饰
Season(String name) {
this.name = name;
}
}

实际上它底层自动完成了实例化工作,反编译也看到了这一点,它是在静态块中完成对象的实例化工作的。类似于这种:

1
2
3
4
public static final  SPRING=new SPRING("春");
public static final SPRING=new SUMMER("夏");
public static final SPRING=new AUTUMN("秋");
public static final SPRING=new WINTTER("冬");

枚举实现接口

枚举不可以继承,但可以实现接口。

1
2
3
public interface GenderDesc {
void info();
}

枚举类实现该接口:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//实现接口,并且以内部类的形式
public enum Gender implements GenderDesc
{
// public static final Gender MALE = new Gender("男");
MALE("男") {
public void info() {
System.out.println("gender male information");
}
},
FEMALE("女") {

public void info() {
System.out.println("gender female information");
}
};
private String name;
private Gender(String name) {
this.name = name;
}
}
public class enumTest {
public static void main(String[] args) {
// 通过valueof方法获取指定枚举类的值
Gender gf = Enum.valueOf(Gender.class, "FEMALE");
Gender gm = Enum.valueOf(Gender.class, "MALE");
System.out.println(gf + " is stand for " + gf.getName());
System.out.println(gm + " is stand for " + gm.getName());
gf.info();
gm.info();
}
}

枚举实现单例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.bigdata.juc.singleton;
/*
* 枚举类型:表示该类型的对象是有限的几个
* 我们可以限定为一个,就成了单例
*/
enum EnumSingleton{
//等价于 public static final INSTANCE=new EnumSingleton();
INSTANCE
}
public class Singleton2 {
public static void main(String[] args) {
EnumSingleton s = EnumSingleton.INSTANCE;
System.out.println(s);
}
}

枚举类不会被反射玩坏

1
2
3
4
5
6
7
8
9
public T newInstance(Object ... initargs)
throws InstantiationException, IllegalAccessException,
IllegalArgumentException, InvocationTargetException
{
...
if ((clazz.getModifiers() & Modifier.ENUM) != 0)
throw new IllegalArgumentException("Cannot reflectively create enum objects");
...
}

可以看到异常是上面代码抛出的,说明它不能够对于枚举类型进行反射创建枚举类的实例,也即API层面就限制住了不能通过反射实例化枚举实例。

文章目录
  1. 1. 概述
  2. 2. 枚举类和普通类的区别
  3. 3. 枚举类的成员变量、方法和构造器
  4. 4. 枚举实现接口
  5. 5. 枚举实现单例
  6. 6. 枚举类不会被反射玩坏
|