版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/aimomo007/article/details/89332270
枚举类型
定义一个枚举类型
public enum Calculator {
ADD,SUBSTRACT,MUTIPLE,DIVIDE;
}
enum很像特殊的class,实际上enum声明定义的类型就是一个类。 而这些类都是类库中Enum类的子类(java.lang.Enum)。它们继承了这个Enum中的许多有用的方法。
编译
通过javac工具将Calculator.java编译成.class文件
命令:javac Calculator.java
通过javap编译为可读字节码文件
public final class huyp.learning.jdk8.lang.Calculator extends java.lang.Enum<huyp.learning.jdk8.lang.Calculator> {
public static final huyp.learning.jdk8.lang.Calculator ADD;
public static final huyp.learning.jdk8.lang.Calculator SUBSTRACT;
public static final huyp.learning.jdk8.lang.Calculator MUTIPLE;
public static final huyp.learning.jdk8.lang.Calculator DIVIDE;
public static huyp.learning.jdk8.lang.Calculator[] values();
Code:
0: getstatic #1 // Field $VALUES:[Lhuyp/learning/jdk8/lang/Calculator;
3: invokevirtual #2 // Method "[Lhuyp/learning/jdk8/lang/Calculator;".clone:()Ljava/lang/Object;
6: checkcast #3 // class "[Lhuyp/learning/jdk8/lang/Calculator;"
9: areturn
public static huyp.learning.jdk8.lang.Calculator valueOf(java.lang.String);
Code:
0: ldc #4 // class huyp/learning/jdk8/lang/Calculator
2: aload_0
3: invokestatic #5 // Method java/lang/Enum.valueOf:(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;
6: checkcast #4 // class huyp/learning/jdk8/lang/Calculator
9: areturn
static {};
Code:
0: new #4 // class huyp/learning/jdk8/lang/Calculator
3: dup
4: ldc #7 // String ADD
6: iconst_0
7: invokespecial #8 // Method "<init>":(Ljava/lang/String;I)V
10: putstatic #9 // Field ADD:Lhuyp/learning/jdk8/lang/Calculator;
13: new #4 // class huyp/learning/jdk8/lang/Calculator
16: dup
17: ldc #10 // String SUBSTRACT
19: iconst_1
20: invokespecial #8 // Method "<init>":(Ljava/lang/String;I)V
23: putstatic #11 // Field SUBSTRACT:Lhuyp/learning/jdk8/lang/Calculator;
26: new #4 // class huyp/learning/jdk8/lang/Calculator
29: dup
30: ldc #12 // String MUTIPLE
32: iconst_2
33: invokespecial #8 // Method "<init>":(Ljava/lang/String;I)V
36: putstatic #13 // Field MUTIPLE:Lhuyp/learning/jdk8/lang/Calculator;
39: new #4 // class huyp/learning/jdk8/lang/Calculator
42: dup
43: ldc #14 // String DIVIDE
45: iconst_3
46: invokespecial #8 // Method "<init>":(Ljava/lang/String;I)V
49: putstatic #15 // Field DIVIDE:Lhuyp/learning/jdk8/lang/Calculator;
52: iconst_4
53: anewarray #4 // class huyp/learning/jdk8/lang/Calculator
56: dup
57: iconst_0
58: getstatic #9 // Field ADD:Lhuyp/learning/jdk8/lang/Calculator;
61: aastore
62: dup
63: iconst_1
64: getstatic #11 // Field SUBSTRACT:Lhuyp/learning/jdk8/lang/Calculator;
67: aastore
68: dup
69: iconst_2
70: getstatic #13 // Field MUTIPLE:Lhuyp/learning/jdk8/lang/Calculator;
73: aastore
74: dup
75: iconst_3
76: getstatic #15 // Field DIVIDE:Lhuyp/learning/jdk8/lang/Calculator;
79: aastore
80: putstatic #1 // Field $VALUES:[Lhuyp/learning/jdk8/lang/Calculator;
83: return
}
该将语句翻译为了指令,为了看上去更简单,采用jad工具对其进行反编译,得到Calculator.java文件
反编译
命令:jad -sjava Calculator.class
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3)
// Source File Name: Calculator.java
package huyp.learning.jdk8.lang;
public final class Calculator extends Enum
{
public static Calculator[] values()
{
return (Calculator[])$VALUES.clone();
}
public static Calculator valueOf(String s)
{
return (Calculator)Enum.valueOf(huyp/learning/jdk8/lang/Calculator, s);
}
private Calculator(String s, int i)
{
super(s, i);
}
public static final Calculator ADD;
public static final Calculator SUBSTRACT;
public static final Calculator MUTIPLE;
public static final Calculator DIVIDE;
private static final Calculator $VALUES[];
static
{
ADD = new Calculator("ADD", 0);
SUBSTRACT = new Calculator("SUBSTRACT", 1);
MUTIPLE = new Calculator("MUTIPLE", 2);
DIVIDE = new Calculator("DIVIDE", 3);
$VALUES = (new Calculator[] {
ADD, SUBSTRACT, MUTIPLE, DIVIDE
});
}
}
总结
根据上述反编译的结果,详细介绍enum定义的枚举类的特征及其用法。
1、Calculator枚举类就是class,而且是一个不可以被继承的final类。
其枚举值(ADD,SUBSTRACT,MULTIPLE,DIVIDE)都是Calculator类型的的类静态常量,这也是枚举类的枚举值最好全部大写的原因
2、即然枚举类是class,当然在枚举类型中有构造器,方法和数据域。
枚举类的构造器是私有的,在构造值时使用
3、枚举类都继承了Enum类
重写了values()、valueOf()等方法