1. 创建一个枚举类
public enum A {
X, Y, Z; //枚举类的第一行必须是枚举对象的名字
//定义类的各种成员...
//定义类的各种方法...
}
要注意的是,在枚举类中,第一行必须是枚举对象的名字。
以上是我们在编译器中编写的代码,那么在实际编译后是什么样子呢?代码如下:
public final class A extends java.lang.Enum<A> {
public static final A X = new A();
public static final A Y = new A();
public static final A Z = new A();
public static A[] values();
public static A valueOf(java.lang.String);
}
注意:
- 枚举类的第一行只能罗列一些名称,这些名称都是常量,并且每个常量记住的都是枚举类的一个对象。
- 枚举类的构造器都是私有的(写不写都只能是私有的),因此,枚举类对外不能创建对象。
- 枚举都是最终类,不能被继承。
- 枚举类中,从第二行开始,可以定义类的其他各种成员。
- 编译器为枚举类新增了几个方法,并且枚举类都是继承:java.lang.Enum类的,从enum类也会继承到一些方法。
2. 调用枚举类中的一个枚举对象
public class Main() {
public static void main(String[] args) {
A a1 = A.X;
System.out.println(a1);
}
}
上述打印出来的结果为A
3. 两点注意:
1. 枚举类的构造器是私有的,不能对外创建对象
public enum A {
X, Y, Z;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Test {
public static void main(String[] args) {
A a = new A();
}
}
2. 枚举类的第一行都是常量,记住的是枚举类的对象
public class Test {
public static void main(String[] args) {
A a2 = A.Y;
}
}
4. 枚举类所提供的额外API
1. 拿到枚举类的全部对象
使用 枚举类名称.values() 可以获取枚举类的全部对象。在下面的代码中,将拿到的所有对象存入数组as。
public class Test {
public static void main(String[] args) {
A a2 = A.Y;
A[] as = A.values();
//打印数组as
for (int i = 0; i < as.length; i++) {
System.out.println(as[i]);
}
}
}
输出结果:
2. 获取枚举对象的名称,索引
首先,将枚举对象Z存入a1变量,接着,可以使用 a1.name() 获取枚举对象的名称;使用 a1.ordinal() 获取对象的索引
public class Test {
public static void main(String[] args) {
A a1 = A.valueOf("Z");
System.out.println(a1.name()); //Z
System.out.println(a1.ordinal()); //获取索引
}
}
代码输出结果:
5. 拓展: 抽象枚举
所谓抽象枚举,就是在枚举类中定义抽象方法。
要注意的是,在这种情况下,第一行就不能直接写枚举对象的名称了,因为这里抽象类是不能直接创建抽象对象的,所以需要重写:
public enum A {
X(){
@Override
public void go() {
}
},Y("张三"){
@Override
public void go() {
System.out.println(getName() + "在跑~~");
}
};
private String name;
public abstract void go();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
以上是一个抽象枚举的例子,那么我们现在来Main类中调用一下
public class Main() {
public static void main(String[] args) {
A y = A.Y;
y.go();
}
}
这样将会输出结果:张三在跑~~
6. 使用枚举类实现单例设计模式
由于枚举类本身的构造器是私有化的,所以可以很快就写出一个单例设计模式。
public enum A {
X;
}
然后在后面去写这个单例需要实现的方法就可以了