JAVA 枚举
来源:互联网 发布:刀剑神域第二季 知乎 编辑:程序博客网 时间:2024/06/05 08:36
14. JAVA 枚举(Enum、类集EnumMap&EnumSet 、实现接口、定义抽象方法) ----- 学习笔记
http://blog.csdn.net/forfan06/article/details/38847777
本章目标:
- 了解枚举可以解决哪些技术问题
- 掌握枚举的定义方式
- 清楚地掌握enum关键字与Enum类的关系
- 掌握JDK1.5之后的枚举操作类:EnmuSet、EnumMap
- 让枚举类实现一个接口或在枚举类中定义抽象方法
枚举是在JDK1.5之后另外一个重要的特性,在枚举中可以限制一个类的对象产生范围,加入了枚举之后Java又对之前的类集进行了扩充,产生了一些新的枚举支持类 --- EnumSet、EnumMap,为枚举的使用提供了方便。
14.1 枚举类型简介
在JDK1.5之前,Java有两种方式定义新类型: 类和接口。 对于大部分面向对象编程来说,这两种方法看起来似乎足够了。但是在一些特殊的情况下,这些方法就不适合了。 例如,想定义一个Color类,它只能有Red、Green、Blue3种植,其他的任何值都是非法的,那么JDK1.5之前虽然可以构造这样的代码,但是要做很多的工作,就可能带来各种不安全的问题。而在JDK1.5之后,引入的枚举类型(Enum)就能避免这些问题。
14.2 使用简单程序完成枚举的功能
枚举是在JDK1.5之后引入的, 如果在JDK1.5之前完成枚举的功能,则必须依靠类似于以下的程序代码完成。
范例: 使用简单类完成枚举操作
- class Color{
- public static final Color RED = new Color("Red"); //定义第一个对象
- public static final Color GREEN = new Color("Green"); //定义第二个对象
- public static final Color BLUE = new Color("Blue"); //定义第三个对象
- private String name;
- private Color(String name){
- this.setName(name);
- }
- public String getName(){
- return this.name;
- }
- public void setName(String name){
- this.name = name;
- }
- public static Color getInstance(int i){ //等到一个颜色,只能从固定的几个颜色中取得中得
- switch(i){
- case 1:{
- return RED;
- }
- case 2:{
- return GREEN;
- }
- case 3:{
- return BLUE;
- }
- default:{
- return null;
- }
- }
- }
- }
- public class ColorDemo01{
- public static void main(String args[]){
- Color c1 = Color.RED;
- System.out.println(c1.getName());
- Color c2 = Color.getInstance(3);
- System.out.println(c2.getName());
- }
- }
以上程序将Color类中的构造方法私有化,之后再类中准备了若干个实例化对象,以后如果要取得Color类的实例, 则只能从BLUE、GREEN、RED3个对象中取得,这样就有效地限制了对象的取得范围。
以上使用的Color对象指定的范围,是通过一个个常量对每个对象进行编号的。 也就是说,一个个的对象就相当于用常量表示了。 所以,按照这个思路也可以直接使用一个接口规定出一组常量的范围。
范例: 使用接口表示一组范围
- package org.forfan06.colordemo;
- public interface Color{
- public static final int RED = 1;
- public static final int GREEN = 2;
- public static final int BLUE = 3;
- }
以上表示出的各个颜色是通过接口指定好的常量范围,与之前相比更加简单。但是这样做也会存在另外一个iewenti,如果现在使用如下的代码:
- package org.forfan06.colordemo;
- public class ColorDemo02{
- public static void main(String args[]){
- System.out.println(Color.RED + Color.GREEN);
- }
- }
两个颜色的常量相加之后形成了“3”,这样的结果看起来会令人非常困惑,操作很不明确。
另外,使用以上这种方法,用户如果想知道到底有多少个颜色可以使用,则实现的代码非常复杂。在JDK1.5之后就有了专门解决这样问题的方法。
14.3 定义一个枚举类型
在JDK1.5之后,引入了一个新的关键字类型 --- enum, 可以直接定义枚举类型。
- //声明枚举类型
- [public] enum 枚举类型名称{
- 枚举对象1, 枚举对象2, ..., 枚举对象n;
- }
范例: 定义一个Color的枚举类型
- package org.forfan06.enumdemo;
- public enum Color{
- RED, GREEN, BLUE;
- }
以上的Color定义出来的枚举类型,其中包含RED、GREEN、BLUE3个数据。
可以使用 “ 枚举.variable ” 的形式取出枚举中的指定内容。
范例: 取出一个枚举内容
- package org.forfan06.enumdemo;
- enum Color{
- RED, GREEN, BLUE;
- }
- public class GetEnumContent{
- public static void main(String args[]){
- Color c = Color.BLUE;
- System.out.println(c);
- }
- }
运行结果:
- BLUE
枚举类型的数据也可以使用 “ 枚举.values() ” 的形式,将全部的枚举类型变为对象数组的形式, 之后使用foreach进行输出
范例: 使用foreach输出枚举内容
- package org.forfan06.enumdemo;
- enum Color{
- RED, GREEN, BLUE;
- }
- public class PrintEnum{
- public static void main(String args[]){
- for(Color c:Color.values()){ // 枚举.values()表示得到全部枚举的内容
- System.out.print(c + "、"); //输出结果: RED、GREEN、BLUE、
- }
- }
- }
枚举中的每个类型也可以使用switch进行判断,但是在switch语句中使用枚举类型时,一定不能再每一个枚举类型值得前面加上枚举类型的类名(例如,Color.BLUE),否则编译器会报错!!!!
- package org.forfan06.enumdemo;
- enum Color{
- RED, GREEN, BLUE;
- }
- public class SwithcPrintDemo{
- public static void main(String args[]){
- for(Color c:Color.values()){
- print(c);
- }
- }
- public static void print(Color color){
- switch(color){
- case RED:{
- System.out.println("RED");
- break;
- }
- case GREEN:{
- System.out.println("GREEN");
- break;
- }
- case BLUE:{
- System.out.println("BLUE");
- break;
- }
- default:{
- System.out.println("Unknown");
- break;
- }
- }
- }
- }
以上的Color.values()方法表示取得枚举中的全部内容,返回的是一个对象数组,这是枚举本身支持的一个方法,除了这个方法之外, 到底还有哪些方法可以供开发者使用呢? 要了解这些,就必须深入分析枚举类 --- Enum类
14.4 Enum
从前面的讲解中可以知道,使用enum关键字可以定义一个枚举,实际上此关键字表示的是java.lang.Enum类型,即使用enum声明的枚举类型就相当于定义了一个类!!而此类默认继承了java.lang.Enum类。
- //java.lang.Enum类的定义
- public abstract class Enum<E extends Enum<E>> extends Object implements Comparable<E>, java.io.Serializable
Enum类的定义,此类实现了Comparable和Serializable两个接口, 证明了枚举类型可以使用比较器和序列化操作!!!!!!!!!!!
Enum类中包含的方法:
下面来逐步观察这些方法的使用:
14.4.1 取得枚举的信息
在枚举类建立完成之后,实际上都会为其调用枚举类中的构造方法,为其赋值。 在Enum类的构造方法中的第一个参数name就是定义的枚举的名称,第二个参数ordinal则会从0开始依次进行编号。
之后可以使用Enum类中提供的name()、ordinal()方法取得名称和编号!!
范例: 验证name()、ordinal()方法
- package org.forfan06.enumdemo;
- enum Color{
- RED, GREEN, BLUE;
- }
- public class GetEnumInfo{
- public static void main(String args[]){
- for(Color c:Color.values()){
- System.out.println(c.ordinal() + "--->" + c.name());
- }
- }
- }
运行结果:
- 0--->RED
- 1--->GREEN
- 2--->BLUE
14.4.2 为每一个枚举对象属性赋值
1. 通过构造方法为属性赋值
每个枚举类中都有其指定好的若干对象,当然,每一个枚举对象中也可以包含多个属性。而,这些属性也可以通过构造方法为其赋值。
范例: 通过构造方法为枚举属性赋值
- enum Color{
- RED("红色"), GREEN("绿色"), BLUE("蓝色");
- private Color(String name){
- this.setName(name);
- }
- private String name;
- public String getName(){
- return name;
- }
- public void setName(String name){
- this.name = name;
- }
- }
- public class ConstructorEnum{
- public static void main(String args[]){
- for(Color c:Color.values()){
- System.out.println(c.ordinal() + "-->" + c.name() + "(" + c.getName() + ")");
- }
- }
- }
运行结果:
- 0-->RED(红色)
- 1-->GREEN(绿色)
- 2-->BLUE(蓝色)
以上程序代码在定义的Color枚举类中设置了一个name属性,并且通过构造方法设置name属性的内容。因为Color中已经明确地写出了有一个参数的构造方法,所以在声明枚举内容时就必须调用这个构造方法,这样在定义枚举内容时就必须使用如下的语句形式:
RED("红色"), GREEN("绿色"), BLUE("蓝色");
2. 通过setter方法为属性赋值
以上是通过构造方法的方式为属性赋值的, 当然,也可以通过调用setter()方法来为指定的属性赋值。 但是,这样一来就必须明确每一个枚举类的对象,如果操作的对象是RED,则名字应该是“红色”;如果操作的对象是GREEN,则名字应该是“蓝色”等等。
范例: 使用setter()方法设置内容
- package org.forfan06.enumapidemo;
- enum Color{
- RED, GREEN, BLUE;
- /**
- RED("红色"), GREEN("绿色"), BLUE("蓝色");
- private Color(String name){
- this.setName(name);
- }
- **/
- private String name;
- public String getName(){
- return this.name;
- }
- public void setName(String name){
- switch(this){
- case RED:{ //判断是否为该颜色
- if("红色".equals(name)){
- this.name = name; //设置名称
- }else{
- System.out.println("设置内容错误。");
- }
- break;
- }
- case GREEN:{ //判断是否为该颜色
- if("绿色".equals(name)){
- this.name = name; //设置名称
- }else{
- System.out.println("设置内容错误。");
- }
- break;
- }
- case BLUE:{ //判断是否为该颜色
- if("蓝色".equals(name)){
- this.name = name; //设置名称
- }else{
- System.out.println("设置内容错误。");
- }
- break;
- }
- }
- }
- /**
- public void setName(String name){
- this.name = name;
- }
- **/
- }
- public class SetEnum{
- public static void main(String args[]){
- Color c = Color.BLUE;
- c.setName("兰色"); //设置错误的名字
- c.setName("蓝色"); //设置正确的名字
- System.out.println(c.getName());
- /**
- for(Color c:Color.values()){
- System.out.println(c.ordinal() + "-->" + c.name() + "(" + c.getName() + ")");
- }
- **/
- }
- }
运行结果:
- 设置内容错误。
- 蓝色
从以上代码中,首先通过枚举类取得了里面的一个对象。之后开始为其设置内容,一开始设置了不符合要求的内容,所以会出现“设置内容错误”的提示;而如果设置的内容正确,则可以直接将其赋值给name属性。
如果不想通过 “ 枚举类.对象 ” 的形式取得每一个枚举类的对象, 也可以, 使用Enum类定义的 “ 枚举类.valueOf() ”方法的形式进行调用!!!!
范例: 使用valueOf()方法找到一个枚举对象
- package org.forfan06.enumapidemo;
- enum Color{
- RED, GREEN, BLUE;
- /**
- RED("红色"), GREEN("绿色"), BLUE("蓝色");
- private Color(String name){
- this.setName(name);
- }
- **/
- private String name;
- public String getName(){
- return this.name;
- }
- public void setName(String name){
- switch(this){
- case RED:{ //判断是否为该颜色
- if("红色".equals(name)){
- this.name = name; //设置名称
- }else{
- System.out.println("设置内容错误。");
- }
- break;
- }
- case GREEN:{ //判断是否为该颜色
- if("绿色".equals(name)){
- this.name = name; //设置名称
- }else{
- System.out.println("设置内容错误。");
- }
- break;
- }
- case BLUE:{ //判断是否为该颜色
- if("蓝色".equals(name)){
- this.name = name; //设置名称
- }else{
- System.out.println("设置内容错误。");
- }
- break;
- }
- }
- }
- /**
- public void setName(String name){
- this.name = name;
- }
- **/
- }
- public class ValueOfDemo{
- public static void main(String args[]){
- //Color c = Color.BLUE;
- Color c = Enum.valueOf(Color.class, "BLUE");
- c.setName("兰色"); //设置错误的名字
- c.setName("蓝色"); //设置正确的名字
- System.out.println(c.getName());
- /**
- for(Color c:Color.values()){
- System.out.println(c.ordinal() + "-->" + c.name() + "(" + c.getName() + ")");
- }
- **/
- }
- }
以上程序代码,使用valueOf()方法来获取Enum类的一个枚举对象,第一个参数使用了 “ 枚举.class ” 的形式,这里是Java的反射机制。 在后面的章节会详细的解释。
14.4.3 使用比较器
在Enum类的定义中已经实现好了Comparable接口,所以枚举类的内容本身是可以进行排序的,下面通过TreeSet演示枚举的排序操作
TreeSet类可以直接进行排序(类集部分讲解到过),排序的规则是通过Comparable接口完成的!!!
范例: 验证枚举比较器
- package org.forfan06.enumapidemo;
- import java.util.Set;
- import java.util.TreeSet;
- import java.util.Iterator;
- enum Color{
- RED, GREEN, BLUE;
- }
- public class ComparableEnum{
- public static void main(String args[]){
- Set<Color> set = new TreeSet<Color>();
- set.add(Color.GREEN);
- set.add(Color.BLUE);
- set.add(Color.RED);
- Iterator<Color> iter = set.iterator();
- while(iter.hasNext()){
- System.out.print(iter.next() + "、");
- }
- }
- }
运行结果:
- RED、GREEN、BLUE、
14.5 类集对枚举的支持 --- EnumMap、EnumSet
在JDK1.5的java.util程序包中提供了两个新的集合操作类: EnumMap、EnumSet类, 这两个类与枚举类型的结合应用可以使以前非常繁琐的程序变得简单方便。
- EnumSet类提供了java.util.Set接口的一个特殊实现;
- EnumMap类提供了java.util.Map接口的一个特殊实现,该类中的键(key)是一个枚举类型。
14.5.1 EnumMap
EnumMap类,是Map接口的子类,所以本身还是以Map的形式进行操作(key --> value)。
如果要使用EnumMap,则首先要创建EnumMap类的实例化对象,在创建此对象时必须指定要操作的枚举类型。
- //EnumMap类的构造方法
- public EnumMap(Class<K> keyType)
- package org.forfan06.enumcol;
- import java.util.EnumMap;
- import java.util.Map;
- enum Color{
- RED, GREEN, BLUE;
- }
- public class EnumMapDemo{
- public static void main(String args[]){
- Map<Color, String> desc = null;
- desc = new EnumMap<Color, String>(Color.class);
- desc.put(Color.RED, "红色");
- desc.put(Color.GREEN, "绿色");
- desc.put(Color.BLUE, "蓝色");
- System.out.println("=====输出全部的内容=====");
- for(Color c:Color.values()){
- System.out.println(c.name() + "-->" + desc.get(c));
- }
- System.out.println("=====输出全部的键值=====");
- for(Color c:desc.keySet()){
- System.out.print(c.name() + "、");
- }
- System.out.println("\n=====输出全部的内容=====");
- for(String s:desc.values()){
- System.out.print(s + "、");
- }
- }
- }
运行结果:
- =====输出全部的内容=====
- RED-->红色
- GREEN-->绿色
- BLUE-->蓝色
- =====输出全部的键值=====
- RED、GREEN、BLUE、
- =====输出全部的内容=====
- 红色、绿色、蓝色、
14.5.2 EnumSet
EnumSet类,是Set接口的子类, 所以里面的内容是无法重复的!!!使用EnumSet类时不能直接使用关键字new为其进行实例化 v_v 所以在此类中提供了很多的静态方法:
(1)范例: 验证EnumSet -- 将全部的集合设置到EnumSet集合中
- package org.forfan06.enumdemo;
- import java.util.EnumSet;
- enum Color{
- RED, GREEN, BLUE;
- }
- public class EnumSetDemo01{
- public static void main(String args[]){
- EnumSet<Color> eset = null;
- System.out.println("======EnumSet.allOf(Color.class)=====");
- eset = EnumSet.allOf(Color.class);
- print(eset);
- }
- public static void print(EnumSet<Color> temp){
- for(Color c:temp){
- System.out.print(c + "、");
- }
- System.out.println();
- }
- }
运行结果:
- ======EnumSet.allOf(Color.class)=====
- RED、GREEN、BLUE、
(2)范例: 验证EnumSet -- 只设置一个枚举的类型到集合中
- package org.forfan06.enumdemo;
- import java.util.EnumSet;
- enum Color{
- RED, GREEN, BLUE;
- }
- public class EnumSetDemo02{
- public static void main(String args[]){
- EnumSet<Color> eset = null;
- //System.out.println("======EnumSet.allOf(Color.class)=====");
- //eset = EnumSet.allOf(Color.class);
- System.out.println("======EnumSet.of(Color.class)=====");
- eset = EnumSet.of(Color.BLUE);
- print(eset);
- }
- public static void print(EnumSet<Color> temp){
- for(Color c:temp){
- System.out.print(c + "、");
- }
- System.out.println();
- }
- }
运行结果:
- ======EnumSet.of(Color.class)=====
- BLUE、
(3)范例: 验证EnumSet -- 创建只能放入指定枚举类型的集合
- package org.forfan06.enumdemo;
- import java.util.EnumSet;
- enum Color{
- RED, GREEN, BLUE;
- }
- public class EnumSetDemo03{
- public static void main(String args[]){
- EnumSet<Color> eset = null;
- //System.out.println("======EnumSet.allOf(Color.class)=====");
- //eset = EnumSet.allOf(Color.class);
- //System.out.println("======EnumSet.of(Color.class)=====");
- //eset = EnumSet.of(Color.BLUE);
- System.out.println("======EnumSet.noneOf(Color.class)=====");
- eset = EnumSet.noneOf(Color.class);
- eset.add(Color.RED);
- eset.add(Color.BLUE);
- print(eset);
- }
- public static void print(EnumSet<Color> temp){
- for(Color c:temp){
- System.out.print(c + "、");
- }
- System.out.println();
- }
- }
运行结果:
- ======EnumSet.noneOf(Color.class)=====
- RED、BLUE、
(4)范例: 验证EnumSet -- 创建不包含指定元素的集合
- package org.forfan06.enumdemo;
- import java.util.EnumSet;
- enum Color{
- RED, GREEN, BLUE;
- }
- public class EnumSetDemo04_01{
- public static void main(String args[]){
- EnumSet<Color> esetOld = null;
- EnumSet<Color> esetNew = null;
- //System.out.println("======EnumSet.allOf(Color.class)=====");
- //eset = EnumSet.allOf(Color.class);
- //System.out.println("======EnumSet.of(Color.class)=====");
- //eset = EnumSet.of(Color.BLUE);
- esetOld = EnumSet.noneOf(Color.class); //可以加入Color类型的对象
- esetOld.add(Color.RED);
- esetOld.add(Color.BLUE);
- esetNew = EnumSet.complementOf(esetOld); //创建一个不包含指定元素的集合
- System.out.println("======EnumSet.noneOf(Color.class)=====");
- print(esetNew);
- }
- public static void print(EnumSet<Color> temp){
- for(Color c:temp){
- System.out.print(c + "、");
- }
- System.out.println();
- }
- }
运行结果:
- ======EnumSet.noneOf(Color.class)=====
- GREEN、
add()语句的位置影响输出~
- package org.forfan06.enumdemo;
- import java.util.EnumSet;
- enum Color{
- RED, GREEN, BLUE;
- }
- public class EnumSetDemo04_02{
- public static void main(String args[]){
- EnumSet<Color> esetOld = null;
- EnumSet<Color> esetNew = null;
- //System.out.println("======EnumSet.allOf(Color.class)=====");
- //eset = EnumSet.allOf(Color.class);
- //System.out.println("======EnumSet.of(Color.class)=====");
- //eset = EnumSet.of(Color.BLUE);
- esetOld = EnumSet.noneOf(Color.class); //可以加入Color类型的对象
- esetNew = EnumSet.complementOf(esetOld); //创建一个不包含指定元素的集合
- esetOld.add(Color.RED);
- esetOld.add(Color.BLUE);
- System.out.println("======EnumSet.complementOf(Color.class)=====");
- print(esetNew);
- System.out.println("======EnumSet.noneOf(Color.class)=====");
- print(esetOld);
- }
- public static void print(EnumSet<Color> temp){
- for(Color c:temp){
- System.out.print(c + "、");
- }
- System.out.println();
- }
- }
此时的运行结果:
- ======EnumSet.complementOf(Color.class)=====
- RED、GREEN、BLUE、
- ======EnumSet.noneOf(Color.class)=====
- RED、BLUE、
以上程序先通过noneOf()方法创建了一个只能接收Color类型的集合esetOld,然后向其增加了两个元素;
然后,再以esetOld的集合为参考创建了一个新的集合esetNew,esetNew集合中将不包含esetOld中已有的内容。
note: 向参考集合中增加元素的语句add()的位置决定了esetNew里面的元素~~~
- import java.util.EnumSet;
- enum Color{
- RED, GREEN, BLUE;
- }
- public class EnumSetDemo04_03{
- public static void main(String args[]){
- EnumSet<Color> esetOld = null;
- EnumSet<Color> esetNew = null;
- //System.out.println("======EnumSet.allOf(Color.class)=====");
- //eset = EnumSet.allOf(Color.class);
- //System.out.println("======EnumSet.of(Color.class)=====");
- //eset = EnumSet.of(Color.BLUE);
- esetOld = EnumSet.noneOf(Color.class); //可以加入Color类型的对象
- esetOld.add(Color.BLUE);
- esetNew = EnumSet.complementOf(esetOld); //创建一个不包含指定元素的集合
- esetOld.add(Color.RED);
- System.out.println("======EnumSet.complementOf(Color.class)=====");
- print(esetNew);
- System.out.println("======EnumSet.Of(Color.class)=====");
- print(esetOld);
- }
- public static void print(EnumSet<Color> temp){
- for(Color c:temp){
- System.out.print(c + "、");
- }
- System.out.println();
- }
- }
运行结果:
- ======EnumSet.complementOf(Color.class)=====
- RED、GREEN、
- ======EnumSet.Of(Color.class)=====
- RED、BLUE、
(5)范例: 验证EnumSet -- 复制已有的内容
- package org.forfan06.enumdemo;
- import java.util.EnumSet;
- enum Color{
- RED, GREEN, BLUE;
- }
- public class EnumSetDemo05{
- public static void main(String args[]){
- EnumSet<Color> esetOld = null;
- EnumSet<Color> esetNew = null;
- //System.out.println("======EnumSet.allOf(Color.class)=====");
- //eset = EnumSet.allOf(Color.class);
- //System.out.println("======EnumSet.of(Color.class)=====");
- //eset = EnumSet.of(Color.BLUE);
- esetOld = EnumSet.noneOf(Color.class); //可以加入Color类型的对象
- esetOld.add(Color.BLUE);
- esetOld.add(Color.RED);
- esetNew = EnumSet.copyOf(esetOld); //创建一个不包含指定元素的集合
- System.out.println("======EnumSet.complementOf(Color.class)=====");
- print(esetNew);
- System.out.println("======EnumSet.copyOf(Color.class)=====");
- print(esetOld);
- }
- public static void print(EnumSet<Color> temp){
- for(Color c:temp){
- System.out.print(c + "、");
- }
- System.out.println();
- }
- }
运行结果:
- ======EnumSet.complementOf(Color.class)=====
- RED、BLUE、
- ======EnumSet.copyOf(Color.class)=====
- RED、BLUE、
14.6 枚举类实现接口
枚举类也可以实现一个接口,但是,因为接口中会存在抽象方法,所以枚举类中的每个对象都必须分别实现此抽象方法。
范例: 枚举类实现一个接口
- package org.forfan06.enumdemo;
- interface Print{
- public String getColor();
- }
- enum Color implements Print{
- RED{
- public String getColor(){
- return "红色";
- }
- },
- GREEN{
- public String getColor(){
- return "绿色";
- }
- },
- BLUE{
- public String getColor(){
- return "蓝色";
- }
- };
- }
- public class EnumeImplementsInterfaceDemo{
- public static void main(String args[]){
- for(Color c:Color.values()){
- System.out.print(c.getColor() + "、");
- }
- }
- }
运行结果:
- 红色、绿色、蓝色、
*****枚举类在实现一个接口之后,就必须对枚举类中的每个对象分别实现接口中的抽象方法*****
14.7 枚举类定义抽象方法
枚举类除了可以实现接口之外(每个枚举对象都必须分别实现接口中的抽象方法), 还可以在枚举类中定义抽象方法,这样每个枚举的对象只要分别实现了抽象方法即可。
范例: 在枚举类中定义抽象方法
- enum Color{
- RED{
- public String getColor(){
- return "红色";
- }
- },
- GREEN{
- public String getColor(){
- return "绿色";
- }
- },
- BLUE{
- public String getColor(){
- return "蓝色";
- }
- };
- public abstract String getColor();
- }
- public class AbstractEnumDemo{
- public static void main(String args[]){
- for(Color c:Color.values()){
- System.out.print(c.getColor() + "、");
- }
- }
- }
运行结果:
- 红色、绿色、蓝色、
追问: 此时枚举类Color为什么可以不用abstract关键字来修饰呢?????????????
14.8 本章要点
- 在程序中可以使一个枚举来指定对象的取值范围
- 在Java中使用enum关键字定义一个枚举类, 每个枚举类都是继承Enum类
- 在枚举中可以通过values()方法取得枚举中的全部内容
- 在枚举类中可以定义构造方法,但是在设置枚举范围时必须显式地调用构造方法
- 所有的枚举类都可以直接使用Comparable进行排序,因为Enum类实现了Comparable接口
- Java类集中提供了枚举的支持类EnumMap、EnumSet两个类
- 一个枚举类可以实现一个接口或在类中定义抽象方法;但是,每个枚举对象都必须分别实现全部的抽象方法
14.9 习题
- 定义一个品牌电脑的枚举类,其中只有固定的几个电脑品牌
- 定义一个Person类,其中包含姓名、年龄、生日、性别的属性,其中性别只能是“男”或“女”
14.10 参考资料
- Java枚举类型enum的使用: http://blog.csdn.net/wgw335363240/article/details/6359614
- JAVA枚举类型 : http://www.cnblogs.com/Fskjb/archive/2009/08/03/1537917.html
- 详细介绍java中的枚举类型: http://developer.51cto.com/art/201107/275031.htm
- java枚举类型入门: http://developer.51cto.com/art/201106/266503.htm
相关文章推荐
Java 带有抽象方法的枚举类
public class Demo{public static void main(String[] args){System.out.println(Grade.A.getValue...- u010078400
- 2014年05月29日 15:20
- 1459
对LevelDB的“升级版”存储引擎RocksDB的调研成果
Google的leveldb是个很优秀的存储引擎,但还是有一些不尽人意的地方,比如leveldb不支持多线程合并,对key范围查找的支持还很简单,未做优化措施,等等。而Facebook的RocksDB...- lanxuezaipiao
- 2014年07月28日 13:51
- 12268
做了这件事后,这位程序员月薪从15k变身30k!
闲下来的时候,程序员为了个人成长,和培养核心价值,该怎么规划和学习呢...
java中的实现接口和含有抽象方法的枚举类
含有抽象方法的枚举类型:public enum Operator {/*PLUS , MINUS , TIMES , DIVIDE;double eval(double x , dou...- rylq56m9
- 2013年07月23日 19:44
- 564
JDK5.0新特性:枚举类型enum、枚举集合EnumSet、枚举映射EnumMap
java.lang.Object java.lang.Enum一、枚举特性:1、枚举类型enum和类class、接口interface的级别是一样的,关键字enum;2、定义的每个枚举类型...- lpp1234567
- 2014年03月11日 16:44
- 379
【Java学习笔记】接口 抽象类 抽象方法
一 接口1.不允许多重继承类,可以多重继承接口,继承的多个接口之间用逗号分开。2.接口中定义的常量默认为public, static,and final 。定义的方法都默认是public的...- qingtian12138
- 2017年03月09日 14:20
- 87
程序员跨越式成长指南
完成第一次跨越,你会成为具有一技之长的开发者,月薪可能翻上几番; 完成第二次跨越,你将成为拥有局部优势或行业优势的专业人士,获得个人内在价值的有效提升和外在收入的大幅跃迁……
Java中的枚举——EnumMap与EnumSet
为了更好的支持枚举类型,java.util中添加了两个新类:EnumMap和EnumSet。使用它们可以更高效的操作枚举类型。下面我一一介绍给你: EnumMap是专门为枚举类型量身定做的M...- u012927198
- 2015年04月10日 14:09
- 1005
说说Java中的枚举——EnumMap与EnumSet
为了更好的支持枚举类型,java.util中添加了两个新类:EnumMap和EnumSet。使用它们可以更高效的操作枚举类型。下面我一一介绍给你: EnumMap是专门为枚举类型量身定做的M...- weidawei0609
- 2012年03月02日 09:56
- 697
java基础加强--实现带有抽象方法的枚举
在学枚举的时候,看到这样定义枚举感到很奇怪。public enum WeekDay {SUN,MON,TUE,WED,THI,FRI,SAT}感觉像一个类,但又不是类。。想...- congwiny
- 2014年02月01日 18:04
- 2354
java包 + 接口的定义与实现接口抽象方法 + 并发视频
1.包的概念包(package)是Java提供的一种区别类的名字空间的机制,是类的组织方式,是一组相关类和接口的集合,它提供了访问权限和命名的管理机制。Java中提供的包主要有以下3种用途:...- u013321328
- 2015年01月10日 09:52
- 767
Java中接口的定义与实现接口抽象方法
//如果抽象类的类体里的方法全部都是抽象方法,可以把这个类定义为接口//换言之,类体里全部都是抽象方法,可以把这个类定义为接口.interface Runer//接口的定义,接口里只包含常量和抽象...- StellaAh
- 2011年08月26日 11:41
- 22723
【枚举】_类集对Enum的支持笔记
【枚举】_类集对Enum的支持笔记分类: Java【枚举】_类集对Enum的支持笔记本章目标:掌握EnumMap类的使用掌握EnumSet类的使用3、具...- geili_178
- 2014年10月01日 23:40
- 184
Java enum enumset enummap的详解(记性不好就多动笔)
文章出处:http://www.cnblogs.com/happyPawpaw/archive/2013/04/09/3009553.htmlJava enum的用法详解...- firefoxwyw
- 2015年07月23日 11:14
- 260
熟练使用java的Enum、EnumSet、EnumMap
对java枚举一直没有系统学习过,之前就是用枚举来替代接口中的常量,今天看到同事写的一段代码使用了EnumSet,不是特别熟悉。于是重新学习了Enum、EnumSet、EnumMap。...- aitangyong
- 2017年02月06日 19:56
- 628
JAVA 8新特性 允许接口定义非抽象方法 快速入门案例
JavaSE8.0出来也蛮久了网上也蛮多案例和教程 但大多数都写的比较复杂 而且更新的新特性也不是很齐全。本案例是根据甲骨文官方的Demo进行修改的授人以鱼不如授人以渔,学习方式其...- austral
- 2016年11月29日 23:51
- 846
java学习笔记7--抽象类与抽象方法
接着前面的学习:java学习笔记6--类的继承、Object类java学习笔记5--类的方法 java学习笔记4--类与对象的基本概念(2)java学习笔记3--类与对象的基本概念(1...- GarfieldEr007
- 2016年03月21日 21:45
- 414
java学习笔记7--抽象类与抽象方法
原作链接 作者:archimedes1、终结类与终结方法被final修饰符修饰的类和方法,终结类不能被继承,终结方法不能被当前类的子类重写终结类的特点:不能有派生类终结类存在的理由:...- u012491166
- 2014年12月10日 09:12
- 433
java学习笔记之 --------枚举(enum)
enum枚举类型是JAVA SE 5.0 以后的版本新定义出来的, 在此版本之前,有个常用的方法来做枚举类, 这个是视频中学到的。。。class WeekDay{public stat...- yzldw333
- 2013年03月14日 17:45
- 1891
java学习笔记之枚举类enum(转载)
原文链接:http://www.cnblogs.com/hemingwang0902/archive/2011/12/29/2306263.htmljava enum(枚举)使用详解 + 总结enu...- tjkj10
- 2016年02月12日 00:34
- 190
java xxcy\day01\重点笔记\抽象方法.java
- 2013年12月31日 22:37
- 3KB
- 下载
java之枚举类 Enum学习笔记
某些情况下,一个类的对象是有限并且固定的,比如季节类,只有四个对象。这种实例有限并且固定的类,为枚举类。如何手动实现一个枚举类?规则如下: (1)通过private将构...- Genius_zz
- 2016年09月26日 15:57
- 288
抽象方法模式--认真学习笔记
案例分析:随着社会的不断发展,制造商品的工厂也越来越多,虽然ji- u012427937
- 2014年06月27日 08:00
- 262
13. Java类集 Part 2(Map接口、SortedMap接口、集合工具类Collection、Stack类、属性类Properties) ----- 学习笔记
13.7 Map接口 13.7.1- forfan06
- 2014年08月18日 16:25
- 1135
枚举 _类集对Enum的支持
1、掌握 EnumMap 类的使用2、掌握 EnumSet 类的使用1、EmumMpapublic class EnumMapEnum,V>extends AbstractMa...- hanshileiai
- 2011年09月14日 18:58
- 736
C++学习笔记4--静态属性 静态方法 虚方法 抽象方法 多态性 析构函数 运算符重载 多继承 虚继承
静态属性和静态方法- yglskfjmp
- 2014年06月02日 18:58
- 357
java 使用抽象方法实现的支票夹
- 2010年06月21日 14:45
- 60KB
- 下载
黑马程序员——枚举的原理及枚举构造方法调用,抽象方法实现等等介绍
---------------------- android培训 java培训 期待与您交流! ---------------------- ...- wjw_java
- 2012年09月14日 00:55
- 673
【幻化万千戏红尘】qianfengDay09-java基础学习:接口,抽象类,抽象方法,多态,instanceof
课程回顾: 访问修饰符private--->default--->protected---->public 重写:子类中1、访问修饰符不能比父类的更严格2、静态/非静态、返回值类型、方法...- u013742672
- 2016年07月21日 17:12
- 171
JDK1.5新特性之枚举中的构造函数及抽象方法
事实上,enum声明定义的类型就是yiegele- lzm1340458776
- 2014年05月09日 20:19
- 543
黑马程序员-我的入学笔记5-类的补充(抽象方法和接口)
---------------------- ASP.Net+Android+IO开发S、.Net培训、期待与您交流! ---------------------- 看了抽象方法和接口的基础,只...- u011770456
- 2013年09月19日 03:38
- 409
C#期末总复习 C#语言基础和程序结构 数据类型:数组、结构和枚举 运算符、表达式和结构化程序 类的构造方法,继承,接口和抽象类 委托与事件 WindowsForm应用程序 XML操作等
- 2010年07月26日 11:45
- 409KB
- 下载
JAVA进阶之旅(一)——增强for循环,基本数据类型的自动拆箱与装箱,享元设计模式,枚举的概述,枚举的应用,枚举的构造方法,枚举的抽象方法
JAVA进阶之旅(一)——增强for循环,基本数据类型的自动拆箱与装箱,享元设计模式,枚举的概述,枚举的应用,枚举的构造方法,枚举的抽象方法 学完我们的java之旅,其实收获还是很多的,但是依然还...- qq_26787115
- 2016年09月25日 18:32
- 1410
Enum、EnumMap、EnumSet的用法讲解
今天在工作中遇到这样一个问题,要在前台页面上渲染出来所有的枚举元素,但是前台页面用的是Velocity,所以需要把枚举元素放到Map里,然后在前台进行渲染。这里不能一个一个的取出枚举元素来put的,就...- zknxx
- 2016年07月11日 23:47
- 7498
在Ubuntu为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口(老罗学习笔记4)
在Ubuntu为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口(老罗学习笔记)...- CPJ_phone
- 2015年04月14日 11:23
- 938
python3学习笔记:枚举enum
1. 枚举的定义首先,定义枚举要导入enum模块。枚举定义用class关键字,继承Enum类。用于定义枚举的class和定义类的class是有区别【下一篇博文继续分享】。 示例代码:from e...- xionghuixionghui
- 2017年03月26日 16:33
- 1857
java enum 枚举 学习资料
- 2013年05月13日 11:28
- 27KB
- 下载
JAVA学习笔记13:IO&类集
完成一个学生管理程序,使用学号作为键添加5个学生对象,并可以将全部的信息保存在文件中,可以实现对学生信息的学号查找、输出全部学生信息的功能。...- zengqingmei
- 2016年08月28日 04:26
- 356
Java抽象类和抽象方法、接口
一、抽象类、抽象方法1、抽象类抽象方法就是以abstract修饰的方法,这种方法只声明返回的数据类型、方法名称和参数,没有方法体,也就是说抽象方法只需要声明而不需要实现。 1. 被abstract...- dudu_rong
- 2017年03月26日 12:34
- 293
JAVA 抽象类 抽象方法 接口
抽象类不应该被实例化的类,不能被new出来,有一种抽象的意义例:Animal-->bird--->nightinggaleAnimal类如果被初始化是什么样子的?没有意义于...- wangxiaojingo
- 2013年05月14日 18:48
- 575
随堂笔记7.29:对象,接口,构造方法,引用数据类型,抽象类,抽象方法-------1
1创建对象//创建对象,会调用构造方法 //类中如果没有声明构造方法时会默认生成无参构造方法。2.构造方法//初始化类当中的所有属性 //未赋值的属性为默认值,引用对象为null,bolean为f...- sinat_35541927
- 2016年07月29日 20:00
- 154
java(8)类集/枚举
JAVA类集1.认识类集类集的作用类集实际上就是一个动态的对象数组,与一般的对象数组不同,类集中的对象内容可以任意扩充类集的特征这种框架是高性能的框架必须允许不同类型的...- zhangzh000
- 2015年02月26日 23:02
- 1495
抽象类、抽象方法、接口的区别及实现
一、抽象类、抽象方法抽象方法:类的成员方法,只有声明,没有实现,把实现交给子类。抽象类:含有抽象方法的类。1.有抽象方法的类一定是抽象类,但抽象类里可以没有抽象方法(当然也...- aionbo
- 2016年10月17日 11:49
- 676
使用抽象方法实现多态
- 2009年04月22日 17:02
- 66KB
- 下载
继承类实现抽象方法雇员资料管理
- 2009年12月08日 21:45
- 11KB
- 下载
Java学习系列(五)Java面向对象之抽象类、接口、内部类、枚举类详解
抽象类、接口常常与设计模式紧密相连。掌握抽象类、接口等其实很简单。下面以说明+实例的方式来讲,这样更容易理解。抽象类先看一个关键字“abstract”,我们知道它是抽象的意思。所谓抽象...- xuxu198899223
- 2014年04月25日 11:17
- 483
Java学习系列(五)Java面向对象之抽象类、接口、内部类、枚举类详解
抽象类、接口常常与设计模式紧密相连。掌握抽象类、接口等其实很简单。下面以说明+实例的方式来讲,这样更容易理解。抽象类先看一个关键字“abstract”,我们知道它是抽象的意思。所谓抽象,说的直白一...- JAVE_LOVER
- 2013年09月24日 16:00
- 2151
【Java类集】_Map接口笔记(实例亲测)
【Java类集】_Map接口笔记掌握Map接口与Collection接口不同掌握Map与Map.Entry接口的关系掌握Map接口的常用子类:HashMap、HashTable、Tre...- e421083458
- 2013年01月25日 16:14
- 2360
mybatis Enum自定义EnumTypeHandler(自定义枚举处理器)
- 2013年06月24日 19:06
- 6KB
- 下载
enum枚举的方法
- 2015年03月16日 21:41
- 723B
- 下载
java 几种常用的枚举(Enum)方法
最近枚举类型用的比较频繁DK1.5引入了新的类型——枚举。在Java中它虽然算个“小”功能,却给我的开发带来了“大”方便。用法一:常量在JDK1.5之前,我们定义常量都是:...- oypj2010
- 2012年08月30日 15:28
- 8702
java枚举类Enum方法简介(valueof,value,ordinal)
Enum作为Sun全新引进的一个关键字,看起来很象是特殊的class, 它也可以有自己的变量,可以定义自己的方法,可以实现一个或者多个接口。 当我们在声明一个enum类型时,我们应该注意到en...- congqingbin
- 2012年04月28日 14:42
- 67903
java Enum EnumMap 简单例子
- 2014年08月15日 10:25
- 1KB
- 下载
java学习笔记8——抽象类和接口
对于java这种面向对象的编程语言来说,抽象是他的特点。接下来通过两种形式来体现java的oop(Object Oriented Programming):抽象类和接口。...- u010935199
- 2017年04月07日 15:58
- 226
【学习笔记】Java抽象类和接口的一些总结
今天重温了一遍Java抽象类和接口的一些知识,在这里总结一下,如有不足望指出。...- ricardo_
- 2016年03月25日 15:22
- 173
- JAVA 枚举
- java枚举
- java枚举
- Java 枚举
- Java 枚举
- Java 枚举
- java 枚举
- java 枚举
- java枚举
- java枚举
- java枚举
- java枚举
- Java枚举
- java枚举
- java 枚举
- java枚举
- Java枚举
- Java枚举
- 进程间通信(IPC)2 ------ 有名管道
- JAVA快速批量删除文件
- mac下载的文件后缀@问题:-rw-r--r--@
- rabbitmq lazy-queues测试
- python 浅copy和深deepcopy
- JAVA 枚举
- python在window上的环境搭建
- Unity3d游戏开发注意事项
- Day14
- 浅析Java中的final关键字
- Qt之QStackedWidget
- OpeningStartAnimation
- matlab bsxfun
- WP Rest API 入门详解