首先,要明白枚举是使用enum关键字定义的一种特殊的类,和普通的类一样,它可以拥有成员属性,成员方法,构造方法等,所有枚举类的公共基类都是Enum:
public abstract class Enum<E extends Enum<E>> extends Object implements Comparable<E>, Serializable
Enum有个我们无法调用的保护构造函数
代码示例:
public class Main{
public static void main(String[] args) {
MyEnum myEnum1=MyEnum.Monday;
myEnum1.print();
myEnum1.setName("hello");
System.out.println(myEnum1.getName());
MyEnum myEnum2=MyEnum.Friday;
myEnum2.print();
}
}
enum MyEnum implements MyInterface {
Monday,Tuesday,Friday;
private String name; //成员属性
MyEnum(String name){ //构造函数不能修饰为public或project,默认为private
this.name=name;
}
MyEnum() {
}
public String getName() { //成员方法
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void print() {
System.out.println("who are you");
}
}
interface MyInterface{
void print();
}
结果:
可以把枚举看作是一个单例模式的扩展,构造函数被私有化,将有限的实例化对象作为参数供外部类调用,使用反射我们可以解析出如下属性:进一步验证了此说法的正确性
现在又有了一个新问题,如果将接口的实现,放在每个类的公共部分,那么该类的每个枚举类对象自然对此方法的实现是相同的,那么接口就没啥意思了,这时我们可以在每个实例化对象中实现此接口,如下:
public class Main{
public static void main(String[] args) {
MyEnum myEnum1=MyEnum.Monday;
myEnum1.print();
MyEnum myEnum2=MyEnum.Friday;
myEnum2.print();
}
}
enum MyEnum implements MyInterface {
Monday{
@Override
public void print() {
System.out.println("i am Monday");
}
},Friday{
@Override
public void print() {
System.out.println("i am Friday");
}
};
public String name="hello"; //成员属性
MyEnum(String name){ //构造函数不能修饰为public或project,默认为private
this.name=name;
}
MyEnum() {
}
public String getName() { //成员方法
return name;
}
public void setName(String name) {
this.name = name;
}
}
interface MyInterface{
void print();
}
结果:
注意:
- 每个实例化对象中不可以定义自己的方法和属性
- 枚举的默认构造函数为private
- 如果不声明有参构造器,则枚举类可以不声明默认无参构造器,但如果声明了有参构造器,则枚举类必须声明默认无参构造器