相同点
枚举类是一种特殊的类,它和普通的类一样,有自己的成员变量、成员方法、构造器。
不同点
枚举的构造方法私有,构造器只能使用 private 访问修饰符,所以无法从外部调用构造器,构造器只在构造枚举值时被调用。也就是说枚举类不给外界实例化的机会,只能它自己实例化,而一个枚举类的所有实例就只有枚举前面分号前的那几个,其他地方不允许创建。
枚举类的所有实例(枚举值)必须在枚举类的第一行显式地列出,否则这个枚举类将永远不能产生实例。列出这些实例(枚举值)时,系统会自动添加 public static final 修饰,无需程序员显式添加。
关于以上两点的一个例子
1 2 3 | public enum Color { GREEN,RED,BLUE,GRAY; } |
如果翻译为普通类大致为:
1 2 3 4 5 6 7 8 9 | public class Color { public static final Color GREEN = new Color(), RED = new Color(), BLUE = new Color(), GRAY = new Color(); private Color() { } } |
枚举允许为其定义抽象方法,如果枚举里声明一个抽象方法,前面的每个实例就必须要实现该方法。注意abstract关键字对于枚举类来说是不需要的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | public enum Color { GREEN { @Override void draw() { } },RED { @Override void draw() { } },BLUE { @Override void draw() { } },GRAY { @Override void draw() { } }; abstract void draw(); } |
三、向枚举中添加新方法
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 32 33 | public enum Color { RED( "红色" , 1 ), GREEN( "绿色" , 2 ), BLANK( "白色" , 3 ), YELLO( "黄色" , 4 ); // 成员变量 private String name; private int index; // 构造方法 private Color(String name, int index) { this .name = name; this .index = index; } // 普通方法 public static String getName( int index) { for (Color c : Color.values()) { if (c.getIndex() == index) { return c.name; } } return null ; } // get set 方法 public String getName() { return name; } public void setName(String name) { this .name = name; } public int getIndex() { return index; } public void setIndex( int index) { this .index = index; } } } |