Java基础系列:(2)关于枚举的简单总结
2016-02-02 10:04
639 查看
一 枚举类型简介 在JDK1.5之前,Java是没有枚举类型的,只有:类和接口。当然,在一般情况下这两种类型就已经足够了,不过在某些特殊情况下就显得有点不合适了。比如:“春夏秋冬”组成的四季这个“数据集”就不能有其他元素;定义一个Color类,它只能有Red,Green,Blue这3个值。像这样只有几个固定的元素组成的“数据集”,其他的任何值都是非法的,这时我们就可以使用枚举类型。 enum 的全称为 enumeration, 是 JDK 1.5 中引入的新特性,存放在 java.lang 包中。如果想要在JDK1.5之前实现类似枚举的功能,就必须依靠类似以下这种代码来完成。
以上的代码还是有不少问题的,最明显的一点是:如果用户想要知道到底有多少种颜色可以使用,其实现的代码就不是那么简单,更别说加入到集合进行操作了。因此,枚举就是为了解决这些问题而产生的。二 枚举类型的定义和常用方法(1)定义:[public] enum 枚举类型名称{ 枚举对象1,枚举对象2,…,枚举对象n;}实例:
三 为每一个枚举对象属性赋值(1)通过构造方法为属性赋值
四 类集对枚举的支持——EnumMap和EnumSet(1)EnumMap的简单使用i)构造方法如下:public EnumMap(Class<K> keyType)ii)简单示例:
五 让枚举类实现一个接口 枚举类实现一个接口,因为接口中含有抽象方法,因此枚举类中的每个对象都需要分别实现接口中的抽象方法,示例代码如下:
六 在枚举类中定义抽象方法 跟前面枚举类实现一个接口类似,也需要枚举类中的每个对象分别实现其抽象方法,示例代码如下:
package javase.enumdemo; public class Color { /** * 定义三个实例化对象,同时构造方法私有化,外部想要取得Color类的实例 * 就只能通过RED,GREEN和BLUE这三个对象 * */ public static final Color RED = new Color("红色"); public static final Color GREEN = new Color("绿色"); public static final Color BLUE = new Color("蓝色"); private String name; /** * 构造方法私有化 * */ private Color(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } public static void main(String[] args) { Color color_1 = Color.RED; System.out.println(color_1.getName()); } }输出:
红色
以上的代码还是有不少问题的,最明显的一点是:如果用户想要知道到底有多少种颜色可以使用,其实现的代码就不是那么简单,更别说加入到集合进行操作了。因此,枚举就是为了解决这些问题而产生的。二 枚举类型的定义和常用方法(1)定义:[public] enum 枚举类型名称{ 枚举对象1,枚举对象2,…,枚举对象n;}实例:
package javase.enumdemo; public enum Color_2 { /** * 定义了3个枚举类型 * */ RED,GREEN,BLUE; }(2)常用方法示例:
package javase.enumdemo; public class Color_2Demo { /** * 取出枚举内容 * */ public void getEnumContent() { Color_2 color = Color_2.RED; System.out.println(color); } /** * 遍历所有枚举内容 * */ public void forEachEnum() { for (Color_2 color : Color_2.values()) System.out.println(color); } /** * switch判断 * */ public void switchPrintEnum() { for (Color_2 color : Color_2.values()) { switch (color) { case RED: System.out.println("红色"); break; case GREEN: System.out.println("绿色"); break; case BLUE: System.out.println("蓝色"); break; default: System.out.println("未知颜色"); break; } } } /** * 测试枚举的ordinal()和name()方法 * */ public void ordinalTest(){ for(Color_2 color : Color_2.values()){ //color.ordinal() 返回枚举常量的序数 //color.name() 返回枚举常量的名称 System.out.println(color.ordinal() + " --> " + color.name()); } } public static void main(String[] args) { Color_2Demo color_2Demo = new Color_2Demo(); color_2Demo.getEnumContent(); System.out.println("******************http://www.zifangsky.cn**********************"); color_2Demo.forEachEnum(); System.out.println("******************http://www.zifangsky.cn**********************"); color_2Demo.switchPrintEnum(); System.out.println("******************http://www.zifangsky.cn**********************"); color_2Demo.ordinalTest(); } }输出:
RED ******************http://www.zifangsky.cn********************** RED GREEN BLUE ******************http://www.zifangsky.cn********************** 红色 绿色 蓝色 ******************http://www.zifangsky.cn********************** 0 --> RED 1 --> GREEN 2 --> BLUE
三 为每一个枚举对象属性赋值(1)通过构造方法为属性赋值
package javase.enumdemo; public enum Color_3 { RED("红色"),GREEN("绿色"),BLUE("蓝色"); private String name; /** * 为枚举对象属性赋值 * 第一种方式,通过构造方法 * */ private Color_3(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } }测试:
package javase.enumdemo; public class Color_3Demo { public static void main(String[] args) { for (Color_3 color : Color_3.values()) System.out.println(color.ordinal() + " --> " + color.name() + "(" + color.getName() + ")"); } }输出:
0 --> RED(红色) 1 --> GREEN(绿色) 2 --> BLUE(蓝色)(2)通过setter方法为属性赋值
package javase.enumdemo; public enum Color_4 { RED,GREEN,BLUE; private String name; public String getName() { return name; } /** * 为枚举对象属性赋值 * 第二种方式,通过setter方法 * */ 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; default: break; } } }测试:
package javase.enumdemo; public class Color_4Demo { public static void main(String[] args) { Color_4 color = Color_4.BLUE; color.setName("红色"); System.out.println(color.getName()); //设置不恰当,输出为:null color.setName("蓝色"); System.out.println(color.getName()); } }输出:
设置属性名称不恰当 null 蓝色
四 类集对枚举的支持——EnumMap和EnumSet(1)EnumMap的简单使用i)构造方法如下:public EnumMap(Class<K> keyType)ii)简单示例:
package javase.enumdemo; import java.util.EnumMap; import java.util.Map; enum Color_5 { RED, GREEN, BLUE; } public class EnumMapDemo { public static void main(String[] args) { Map<Color_5, String> map = new EnumMap<Color_5, String>(Color_5.class); map.put(Color_5.RED, "红色"); map.put(Color_5.BLUE, "蓝色"); //遍历 for (Map.Entry<Color_5, String> mapEntry : map.entrySet()) System.out.println(mapEntry.getKey().name() + " --> " + mapEntry.getValue()); } }输出:
RED --> 红色 BLUE --> 蓝色(2)EnumSet的几种常用方法示例:
package javase.enumdemo; import java.util.EnumSet; public class EnumSetDemo { /** * 将全部枚举类型添加到EnumSet集合中 * */ public void allOfTest(){ EnumSet<Color_5> set = EnumSet.allOf(Color_5.class); for(Color_5 color : set) System.out.print(color + "\t"); System.out.println(); } /** * 只设置一个枚举类型到集合中 * */ public void ofTest(){ EnumSet<Color_5> set = EnumSet.of(Color_5.BLUE); for(Color_5 color : set) System.out.println(color); } /** * 创建一个只能添加指定内容的空集合 * */ public void noneOfTest(){ EnumSet<Color_5> set = EnumSet.noneOf(Color_5.class); set.add(Color_5.RED); set.add(Color_5.GREEN); for(Color_5 color : set) System.out.print(color + "\t"); System.out.println(); } /** * 创建不包含指定元素的集合 * */ public void complementOfTest(){ EnumSet<Color_5> oldSet = EnumSet.of(Color_5.BLUE,Color_5.GREEN); EnumSet<Color_5> newSet = EnumSet.complementOf(oldSet); for(Color_5 color : newSet) System.out.print(color + "\t"); System.out.println(); } /** * 复制已有集合中的内容 * */ public void copyOfTest(){ EnumSet<Color_5> oldSet = EnumSet.of(Color_5.RED,Color_5.GREEN); EnumSet<Color_5> newSet = EnumSet.copyOf(oldSet); for(Color_5 color : newSet) System.out.print(color + "\t"); System.out.println(); } public static void main(String[] args) { EnumSetDemo enumSetDemo = new EnumSetDemo(); enumSetDemo.allOfTest(); System.out.println("******************http://www.zifangsky.cn**********************"); enumSetDemo.ofTest(); System.out.println("******************http://www.zifangsky.cn**********************"); enumSetDemo.noneOfTest(); System.out.println("******************http://www.zifangsky.cn**********************"); enumSetDemo.complementOfTest(); System.out.println("******************http://www.zifangsky.cn**********************"); enumSetDemo.copyOfTest(); } }输出:
RED GREEN BLUE ******************http://www.zifangsky.cn********************** BLUE ******************http://www.zifangsky.cn********************** RED GREEN ******************http://www.zifangsky.cn********************** RED ******************http://www.zifangsky.cn********************** RED GREEN
五 让枚举类实现一个接口 枚举类实现一个接口,因为接口中含有抽象方法,因此枚举类中的每个对象都需要分别实现接口中的抽象方法,示例代码如下:
package javase.enumdemo; interface Print{ public String getColor(); } /** * 枚举类实现了一个接口Print * 因此枚举类中的每个对象都必须分别实现接口中的抽象方法 * */ enum Page implements Print{ WHITEPAGE{ public String getColor() { return "白色"; } },BLUEPAGE{ public String getColor() { return "蓝色"; } },GRAYPAGE{ public String getColor() { return "灰色"; } }; } public class InterfaceEnumDemo { public static void main(String[] args) { Page page = Page.GRAYPAGE; System.out.println(page.getColor()); } }输出:
灰色
六 在枚举类中定义抽象方法 跟前面枚举类实现一个接口类似,也需要枚举类中的每个对象分别实现其抽象方法,示例代码如下:
package javase.enumdemo; /** * 枚举中定义抽象方法 * 同样,枚举类中的每个对象都必须分别实现该抽象方法 * */ enum Person{ STUDENT{ public String getJobName() { return "学生"; } },TEACHER{ public String getJobName() { return "教师"; } },PROGRAMMER{ public String getJobName() { return "程序猿"; } }; public abstract String getJobName(); //抽象方法 } public class AbstractMethodDemo { public static void main(String[] args) { Person person = Person.PROGRAMMER; System.out.println(person.getJobName()); } }输出:
程序猿
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树