资料上说:enum是继承自java.lang.Enum的。我直接写了一下,连编译都通不过。后来又找资料才知道,这个继承是有编译器处理的。现在先直接拿下面的例子说事了:用java命令行直接查看编译好的WeekDay.class文件。
D:\workspace\enumtest\bin\com\lzw\enumtest>javap WeekDay Compiled from "WeekDay.java" public class com.lzw.enumtest.WeekDay extends java.lang.Enum{ public static final com.lzw.enumtest.WeekDay MON; public static final com.lzw.enumtest.WeekDay TUE; public static final com.lzw.enumtest.WeekDay WED; public static final com.lzw.enumtest.WeekDay FUR; public static final com.lzw.enumtest.WeekDay FRI; public static final com.lzw.enumtest.WeekDay STA; public static final com.lzw.enumtest.WeekDay SUN; static {}; public boolean getBoolean(); public int getDay(); public static com.lzw.enumtest.WeekDay[] values(); public static com.lzw.enumtest.WeekDay valueOf(java.lang.String); com.lzw.enumtest.WeekDay(java.lang.String, int, int, com.lzw.enumtest.WeekDay); }
即便如此,想了解enum类型,还是要先了解一下java.lang.Enum类。跟进JDK 源码中,很容易发现Enum类的定义:
public abstract class Enum<E extends Enum<E>> implements Comparable<E>,Serializable { } public final int compareTo(E o) { Enum other = (Enum)o; Enum self = this; if (self.getClass() != other.getClass() && // optimization self.getDeclaringClass() != other.getDeclaringClass()) throw new ClassCastException(); return self.ordinal - other.ordinal; }
在enum元素比较是比较它们的ordinal。源码的东西这里不用多说……
下面直接拿例子解析:
1、枚举类WeekDay.java
package com.lzw.enumtest; public enum WeekDay { MON(1), TUE(2), WED(3), FUR(4), FRI(5) { // 重写,替换父的return false @Override public boolean getBoolean() { return true; } }, STA(6), SUN(7); private int day; // 必须私有化构造方法 ,因为枚举类的成员都是static final的 ,不提供外部赋值 private WeekDay(int day) { this.day = day; } public boolean getBoolean() { return false; } public int getDay() { return day; } }
2、测试类TestJava1.java
package com.lzw.enumtest; import java.util.EnumMap; import java.util.Iterator; import java.util.Map.Entry; public class TestJava1 { public static void main(String[] args) { for (WeekDay day : WeekDay.values()) { // :枚举重写了ToString(),说以枚举变量的值是不带前缀的 switch (day) { case MON: System.out.println("周一:" + day.getDay() + " index:" + day.ordinal() + " boolean:" + day.getBoolean()); break; case TUE: System.out.println("周二:" + day.getDay() + " index:" + day.ordinal() + " boolean:" + day.getBoolean()); break; case FRI: System.out.println("周五:" + day.getDay() + " index:" + day.ordinal() + " boolean:" + day.getBoolean()); break; default: break; } } EnumMap<WeekDay, String> enumMap = new EnumMap<WeekDay, String>(WeekDay.class); enumMap.put(WeekDay.WED, "周三"); enumMap.put(WeekDay.SUN, "周日"); Iterator<Entry<WeekDay, String>> iterator = enumMap.entrySet().iterator(); for (; iterator.hasNext();) { Entry<WeekDay, String> entry = iterator.next(); System.out.println(entry.getKey().name() + "__" + entry.getValue()); } } }
很明显枚举的每一个元素都是其实例,并且是static的哦。每一个ordinal都不相同,这也是java.lang.Enum的compareTo方法告诉我们的:不同元素,其ordinal不同。
至于values()方法,直接看上面的编译好的代码
相关推荐
《Effective Java》第三版中文版目录 第一章 介绍 1 第二章 创建和销毁对象 4 1 考虑用静态工厂方法替换构造器 4 2 当遇到多个构造器参
effective-java.pdf
Effective Java读书笔记.pdf
Effective java 3 学习记录
effective java 读书笔记,第二版自己摘要并翻译,以备速查。
Effective Java读书笔记,记载了大部分我觉的有用的东西,前半部分有代码说明,但后半部分的代码,太过琐碎,就没有整理
【Effective Java】阅读笔记markdown 文件
《Effective Java》读书分享.pptx
15. 使类和成员的可访问性最小化 16. 在公有类中使用访问方法而非公有域 17.使可变性最小化:不可变类
Effective Java Effective Java Effective Java
java四大名著之一:Effective.Enterprise.Java.中文版 高清pdf 下载
effective-java 配套代码
effective java,英文第三版,内容不错,有需要可以下载
构建高效的Java企业级系统是项困难的工作。本书详细介绍企业级计算技术中的常见问题,并描述使用企业级Java平台技术处理这些问题的方法。本书以若干条建议、揸南的形式,言简意赅地介绍了J2EE开发中的微妙之处。无论...
java逻辑思维笔试题Effective Java - 第三版笔记 章节索引 02 - 创建和销毁对象 03 - 所有对象通用的方法 04 - 类和接口 05 - 泛型 06 - 枚举和注释 07 - Lambda 和流 08 - 方法 09 - 通用编程 10 - 例外 11 - 并发 ...
Effective Enterprise Java
永远不要根据枚举的序数导出与它关联的值,而是要将它保存在一个实例域中:public enum Ensemble {Enum规范中谈及ordinal方法时写道:
Effective-Java:Effective Java的所有练习程序