Java枚举类可以定义构造函数
Java枚举类可以定义构造函数,枚举常量后面括号中的参数值就是传递给构造函数的参数。
代码示例:
package com.thb;
public enum Constant {
// 枚举常量后面括号中的参数值就是传递给构造函数的参数值
REGISTER((byte)0x01), HEARTBEAT((byte)0x02), CONFORM((byte)0x07);
private final byte functonCode;
// 定义构造函数
private Constant(byte functonCode){
this.functonCode = functonCode;
}
public byte functonCode() {
return this.functonCode;
}
}
枚举类的构造函数只能是private的
枚举类的构造函数只能是private的,写不写private这个关键字都一样。如果不明确声明private的,编译器也会编译为private的。
如果声明为其它的访问控制修饰符(例如public、protected),就会编译出错。
代码示例:
定义一个枚举类,明确声明了一个构造函数,但没有明确声明private关键字:
package com.thb;
public enum Color {
RED, BLUE, WHITE;
Color() {
}
}
打开Color编译后生成的class文件(为了简洁,只截取了class文件中构造函数这部分),可以看到构造函数被设置为private的:
// Method descriptor #18 (Ljava/lang/String;I)V
// Stack: 3, Locals: 3
private Color(java.lang.String arg0, int arg1);
0 aload_0 [this]
1 aload_1 [arg0]
2 iload_2 [arg1]
3 invokespecial java.lang.Enum(java.lang.String, int) [31]
6 return
Line numbers:
[pc: 0, line: 6]
[pc: 6, line: 8]
Local variable table:
[pc: 0, pc: 7] local: this index: 0 type: com.thb.Color
在枚举类的构造函数中不能包含对父类构造函数的引用
如果在枚举类的构造函数中包含对父类构造函数的引用,就会编译出错。
代码示例:
下面这个枚举类的构造函数中包含了对父类构造函数的引用,编译出错:
如果枚举类没有声明构造函数,那么编译器会生成默认构造函数
代码示例:
下面定义了一个枚举类,没有声明构造函数:
package com.thb;
public enum Fruit {
APPLE, ORANGE, WATERMELON;
}
打开枚举类编译后的class文件(为了简洁,只截取了class文件中生成的默认构造函数),可以发现编译器生成了默认构造函数:
// Method descriptor #18 (Ljava/lang/String;I)V
// Stack: 3, Locals: 3
private Fruit(java.lang.String arg0, int arg1);
0 aload_0 [this]
1 aload_1 [arg0]
2 iload_2 [arg1]
3 invokespecial java.lang.Enum(java.lang.String, int) [31]
6 return
Line numbers:
[pc: 0, line: 3]
Local variable table:
[pc: 0, pc: 7] local: this index: 0 type: com.thb.Fruit