Java基础---枚举
2016-06-17 16:31
567 查看
枚举类:在某些情况下,一个类的对象是有限而且固定的,那么就可以用枚举了。
private修饰构造器
属性使用privatefinal 修饰
把该类的所有实例都使用public static final 来修饰
比较此枚举与指定对象的顺序。
返回与此枚举常量的枚举类型相对应的 Class 对象。
返回此枚举常量的名称,在其枚举声明中对其进行声明。
返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。
返回带指定名称的指定枚举类型的枚举常量。
输出结果:
输出结果:
或者
输出结果:
所以,实际上 enum 就是一个 class,只不过 java 编译器帮我们做了语法的解析和编译而已。
项目源码 GitHub求赞,谢谢!
引用:
java视频教程Java基础枚举-PPS视频
java enum(枚举)使用详解 + 总结 - 星情 - 博客园
java枚举使用详解 - Ruthless - 博客园
java enum的用法详解 - 流浪的虾壳 - 博客频道 - CSDN.NET
手动实现枚举类
手动实现枚举类:private修饰构造器
属性使用privatefinal 修饰
把该类的所有实例都使用public static final 来修饰
public class Season { //1.因为枚举类的对象是有限个,所以不能在类的外部创建类的对象 private Season(String name,String desc){ this.name = name; this.desc = desc; } //2.因为对象是固定的,所以属性是常量 private final String name; private final String desc; //3.在类的内部创建对象,但需要在类的外部访问到该对象,而且还不能被修改 public static final Season SPRING = new Season("春天","春风又绿江南岸"); public static final Season SUMMER = new Season("夏天","映日荷花别样"); public static final Season FALL = new Season("秋天","秋水共长天一色"); public static final Season WINTER = new Season("冬天","窗含西岭千秋雪"); public String getName() { return name; } public String getDesc() { return desc; } }
使用enum
public enum Season2 { //1.必须在枚举类的第一行写出有哪些枚举值 SPRING("春天", "春风又绿江南岸"), SUMMER("夏天", "映日荷花别样"), FALL("秋天", "秋水共长天一色"), WINTER("冬天", "窗含西岭千秋雪"); private final String name; private final String desc; private Season2(String name, String desc) { this.name = name; this.desc = desc; } public String getName() { return name; } public String getDesc() { return desc; } }
enum 对象的常用方法介绍
int compareTo(E o)
比较此枚举与指定对象的顺序。
Class<E> getDeclaringClass()
返回与此枚举常量的枚举类型相对应的 Class 对象。
String name()
返回此枚举常量的名称,在其枚举声明中对其进行声明。
int ordinal()
返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。
String toString()
返回枚举常量的名称,它包含在声明中。
static <T extends Enum<T>> T valueOf(Class<T> enumType, String name)
返回带指定名称的指定枚举类型的枚举常量。
public enum EnumTest { MON, TUE, WED{ @Override public String toString() { return "Today is Wednesday!"; } }, THU, FRI, SAT, SUN; }
//EnumTest EnumTest test = EnumTest.TUE; //compareTo(E o) switch (test.compareTo(EnumTest.MON)) { case -1: Log.d("pepe","TUE 在 MON 之前"); break; case 1: Log.d("pepe","TUE 在 MON 之后"); break; default: Log.d("pepe","TUE 与 MON 在同一位置"); break; } //遍历枚举 Log.d("pepe","遍历ColorEnum枚举中的值"); for(EnumTest color : EnumTest.values()){ Log.d("pepe","遍历toString:"+color.toString()+"---ordinal值:"+color.ordinal()); } //valueOf,由"WED"获取枚举值 EnumTest enumTest=EnumTest.valueOf("WED"); Log.d("pepe","由\"WED\"获取枚举值:"+enumTest.toString()); //values(),获取枚举的个数 Log.d("pepe","ColorEnum枚举中的值有"+EnumTest.values().length+"个"); //getDeclaringClass() Log.d("pepe","getDeclaringClass(): " + test.getDeclaringClass().getName()); //name() 和 toString() Log.d("pepe","name(): " + test.name()); Log.d("pepe","toString(): " + test.toString()); //ordinal(), 返回值是从 0 开始 Log.d("pepe","ordinal(): " + test.ordinal());
输出结果:
TUE 在 MON 之后 遍历ColorEnum枚举中的值 遍历toString:MON---ordinal值:0 遍历toString:TUE---ordinal值:1 遍历toString:Today is Wednesday!---ordinal值:2 遍历toString:THU---ordinal值:3 遍历toString:FRI---ordinal值:4 遍历toString:SAT---ordinal值:5 遍历toString:SUN---ordinal值:6 由"WED"获取枚举值:Today is Wednesday! ColorEnum枚举中的值有7个 getDeclaringClass(): com.zitech.anenum.MainActivity$EnumTest name(): TUE toString(): TUE ordinal(): 1
enum 的方法和接口
覆盖方法
public enum Enumtestt{ MON(1), TUE(2), WED(3), THU(4), FRI(5), SAT(6) { @Override public boolean isRest() { return true; } }, SUN(0) { @Override public boolean isRest() { return true; } }; private int value; private Enumtestt(int value) { this.value = value; } public int getValue() { return value; } public boolean isRest() { return false; } }
//Enumtest Log.d("pepe","Enumtestt.SAT 的 isRest = " + Enumtestt.SAT.isRest());
输出结果:
Enumtestt.SAT 的 isRest = true
实现接口
public enum MyColor implements Behaviour{ RED,GREEN,BLUE; private final String name="fsd"; // 接口方法 @Override public String getInfo() { return this.name; } // 接口方法 @Override public void print() { Log.d("pepe","name:" + this.name); } }
或者
public enum MyColor implements Behaviour{ RED{ @Override public String getInfo() { return this.toString(); } @Override public void print() { Log.d("pepe","name:" + this.toString()); } },GREEN{ @Override public String getInfo() { return this.toString(); } @Override public void print() { Log.d("pepe","name:" + this.toString()); } },BLUE{ @Override public String getInfo() { return this.toString(); } @Override public void print() { Log.d("pepe","name:" + this.toString()); } }; private final String name="fsd"; }
EnumSet,EnumMap 的应用
// EnumSet的使用 EnumSet<EnumTest> weekSet = EnumSet.allOf(EnumTest.class); for (EnumTest day : weekSet) { Log.d("pepe",day.toString()); } // EnumMap的使用 EnumMap<EnumTest, String> weekMap = new EnumMap(EnumTest.class); weekMap.put(EnumTest.MON, "星期一"); weekMap.put(EnumTest.TUE, "星期二"); // ... ... for (Iterator<Map.Entry<EnumTest, String>> iter = weekMap.entrySet().iterator(); iter.hasNext();) { Map.Entry<EnumTest, String> entry = iter.next(); Log.d("pepe",entry.getKey().name() + ":" + entry.getValue()); }
输出结果:
MON TUE Today is Wednesday! THU FRI SAT SUN MON:星期一 TUE:星期二
原理分析
enum 的语法结构尽管和 class 的语法不一样,但是经过编译器编译之后产生的是一个class文件。该class文件经过反编译可以看到实际上是生成了一个类,该类继承了java.lang.Enum。EnumTest 经过反编译(javap com.hmw.test.EnumTest 命令)之后得到的内容如下:public class com.hmw.test.EnumTest extends java.lang.Enum{ public static final com.hmw.test.EnumTest MON; public static final com.hmw.test.EnumTest TUE; public static final com.hmw.test.EnumTest WED; public static final com.hmw.test.EnumTest THU; public static final com.hmw.test.EnumTest FRI; public static final com.hmw.test.EnumTest SAT; public static final com.hmw.test.EnumTest SUN; static {}; public int getValue(); public boolean isRest(); public static com.hmw.test.EnumTest[] values(); public static com.hmw.test.EnumTest valueOf(java.lang.String); com.hmw.test.EnumTest(java.lang.String, int, int, com.hmw.test.EnumTest); }
所以,实际上 enum 就是一个 class,只不过 java 编译器帮我们做了语法的解析和编译而已。
项目源码 GitHub求赞,谢谢!
引用:
java视频教程Java基础枚举-PPS视频
java enum(枚举)使用详解 + 总结 - 星情 - 博客园
java枚举使用详解 - Ruthless - 博客园
java enum的用法详解 - 流浪的虾壳 - 博客频道 - CSDN.NET
相关文章推荐
- C#编程中枚举类型的使用教程
- 枚举的用法详细总结
- PHP中Enum(枚举)用法实例详解
- c#入门之枚举和结构体使用详解(控制台接收字符串以相反的方向输出)
- 理解C#中的枚举(简明易懂)
- C#枚举中的位运算权限分配浅谈
- C++基础入门教程(四):枚举和指针
- FileShare枚举的使用小结(文件读写锁)
- Java枚举类用法实例
- 枚举窗口句柄后关闭所有窗口示例
- javascript模拟枚举的简单实例
- 深入剖析JavaScript中的枚举功能
- 枚举和宏的区别详细解析
- 深入理解C#中的枚举
- C#实现获取枚举中元素个数的方法
- 结合C++11的新特性来解析C++中的枚举与联合
- java中枚举的详细使用介绍
- java枚举的使用示例
- 详解Java中的迭代迭代器Iterator与枚举器Enumeration
- Java枚举详解及使用实例(涵盖了所有典型用法)