java 枚举 类 enum

public abstract class Enum<E extends Enum<E>>
        implements Comparable<E>, Serializable {  

    private final String name;  

    // 当前枚举常量名称
    public final String name() {
    return name;
    }  

    private final int ordinal;  

    // 当前枚举常量次序,从0开始
    public final int ordinal() {
    return ordinal;
    }  

    // 专有构造器,我们无法调用。该构造方法用于由响应枚举类型声明的编译器发出的代码。
    protected Enum(String name, int ordinal) {
    this.name = name;
    this.ordinal = ordinal;
    }  

    // 返回枚举常量的名称,默认是返回name值。可以重写该方法,输出更加友好的描述。
    public String toString() {
    return name;
    }  

    // 比较当前枚举常量是否和指定的对象相等。因为枚举常量是单例的,所以直接调用==操作符。子类不可以重写该方法。
    public final boolean equals(Object other) {
        return this==other;
    }  

    // 返回该枚举常量的哈希码。和equals一致,该方法不可以被重写。
    public final int hashCode() {
        return super.hashCode();
    }  

    // 因为枚举常量是单例的,所以不允许克隆。
    protected final Object clone() throws CloneNotSupportedException {
    throw new CloneNotSupportedException();
    }  

    // 比较该枚举常量和指定对象的大小。它们的类型要相同,根据它们在枚举声明中的先后顺序来返回大小(前面的小,后面的大)。子类不可以重写该方法
    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;
    }  

    // 得到枚举常量所属枚举类型的Class对象
    public final Class<E> getDeclaringClass() {
    Class clazz = getClass();
    Class zuper = clazz.getSuperclass();
    return (zuper == Enum.class) ? clazz : zuper;
    }  

    // 返回带指定名称的指定枚举类型的枚举常量。名称必须与在此类型中声明枚举常量所用的标识符完全匹配。不允许使用额外的空白字符。
    public static <T extends Enum<T>> T valueOf(Class<T> enumType,
                                                String name) {
        T result = enumType.enumConstantDirectory().get(name);
        if (result != null)
            return result;
        if (name == null)
            throw new NullPointerException("Name is null");
        throw new IllegalArgumentException(
            "No enum const " + enumType +"." + name);
    }  

    // 不允许反序列化枚举对象
    private void readObject(ObjectInputStream in) throws IOException,
        ClassNotFoundException {
            throw new InvalidObjectException("can‘t deserialize enum");
    }  

    // 不允许反序列化枚举对象
    private void readObjectNoData() throws ObjectStreamException {
        throw new InvalidObjectException("can‘t deserialize enum");
    }  

    // 枚举类不可以有finalize方法,子类不可以重写该方法
    protected final void finalize() { }
}  
package testenum;

public class TestEnum {
    public enum stats{
        open,off,r,g,b,黄,ff0000;

    }
    public enum color{

    }

    public enum Yes {
        A(0), B(1), C(2), D(3), F(4);  

        private Integer code;  

        Yes() {
        }  

        Yes(int code) {
            this.code = code;
        }  

        public Integer getCode() {
            return code;
        }
    }  

    public enum Week {
        MON{
            public String toLocaleString(){
                return "星期一";
            }
            public String toLocaleString2(){
                return "星期一";
            }
        },TUES{
            public String toLocaleString(){
                return "星期二";
            }
        },WEB{
            public String toLocaleString(){
                return "星期三";
            }

        },THUR{
            public String toLocaleString(){
                return "星期四";
            }

        },FRI{
            public String toLocaleString(){
                return "星期五";
            }

        },SAT{
            public String toLocaleString(){
                return "星期六";
            }

        },SUN{
            public String toLocaleString(){
                return "星期日";
            }

        };
        public abstract String toLocaleString();
    }
    public static void main(String [] args){
        System.out.println("《------------------------------------------------------------------》");
        System.out.println(stats.class);
        System.out.println(stats.off);
        System.out.println(stats.open);
        for(int i=0;i<stats.values().length;i++){
            System.out.println("stats.values()["+i+"]:"+stats.values()[i]);
            System.out.println(stats.valueOf(stats.values()[i].toString()));
        }

        System.out.println("《------------------------------------------------------------------》");
        System.out.println(Yes.class);
        System.out.println(Yes.A);
        System.out.println(Yes.B.getCode());

        for(int i=0;i<Yes.values().length;i++){
            System.out.println("Yes.values()["+i+"]:"+Yes.values()[i]);
            System.out.println(Yes.valueOf(Yes.values()[i].toString()));
        }

        System.out.println("《------------------------------------------------------------------》");
        System.out.println(Week.class);
        System.out.println(Week.MON.FRI.MON);
        System.out.println(Week.SUN.toLocaleString());

        for(int i=0;i<Week.values().length;i++){
            System.out.println("Week.values()["+i+"]:"+Week.values()[i]);
            System.out.println(Week.valueOf(Week.values()[i].toString()));
            System.out.println(Week.valueOf(Week.values()[i].toString()).toLocaleString());
        }
    }
}
时间: 2024-07-31 15:20:33

java 枚举 类 enum的相关文章

Java枚举类enum详解

枚举类enum是JDK1.5引入的,之前都是用public static final int enum_value来代替枚举类的.枚举类enum是一种特殊的类,它默认继承了类java.lang.Enum.和其它普通类一样,enum同样可以有成员变量.方法.构造器,也可以实现一个或多个接口,区别是: 如果有构造器,必须用private修饰. 枚举类不能派生子类. 枚举类所有的实例必须在第一行显示定义.系统会自动给这些实例加上public static final修饰,无须程序员显示定义. 枚举类默

java 枚举类 enum 总结

枚举定义: enum是计算机编程语言中的一种数据类型.枚举类型:在实际问题中,有些变量的取值被限定在一个有限的范围内.例如,一个星期内只有七天,一年只有十二个月,一个班每周有六门课程等等.如果把这些量说明为整型, 字符型或其它类型显然是不妥当的.为此,C语言提供了一种称为“枚举”的类型.在“枚举”类型的定义中列举出所有可能的取值,被说明为该“枚举”类型的变 量取值不能超过定义的范围.应该说明的是,枚举类型是一种基本数据类型,而不是一种构造类型,因为它不能再分解为任何基本类型. java中枚举类总

java枚举类Enum方法简介(valueof,value,ordinal)

Enum作为Sun全新引进的一个关键字,看起来很象是特殊的class,   它也可以有自己的变量,可以定义自己的方法,可以实现一个或者多个接口.   当我们在声明一个enum类型时,我们应该注意到enum类型有如下的一些特征. 1.它不能有public的构造函数,这样做可以保证客户代码没有办法新建一个enum的实例. 2.所有枚举值都是public   ,   static   ,   final的.注意这一点只是针对于枚举值,我们可以和在普通类里面定义   变量一样定义其它任何类型的非枚举变量

【转】java枚举类型enum的使用

原文网址:http://blog.csdn.net/wgw335363240/article/details/6359614 java 枚举类型enum 的使用 最近跟同事讨论问题的时候,突然同事提到我们为什么java 中定义的常量值不采用enmu 枚举类型,而采用public final static 类型来定义呢?以前我们都是采用这种方式定义的,很少采用enum 定义,所以也都没有注意过,面对突入起来的问题,还真有点不太清楚为什么有这样的定义.既然不明白就抽时间研究下吧. Java 中的枚举

java 枚举类型enum 的使用

java 枚举类型enum 的使用 最近跟同事讨论问题的时候,突然同事提到我们为什么java 中定义的常量值不采用enmu 枚举类型,而采用public final static 类型来定义呢?以前我们都是采用这种方式定义的,很少采用enum 定义,所以也都没有注意过,面对突入起来的问题,还真有点不太清楚为什么有这样的定义.既然不明白就抽时间研究下吧. Java 中的枚举类型采用关键字enum 来定义,从jdk1.5才有的新类型,所有的枚举类型都是继承自Enum 类型.要了解枚举类型,建议大家先

Java基础15:深入剖析Java枚举类

Java基础15:深入剖析Java枚举类 枚举(enum)类型是Java 5新增的特性,它是一种新的类型,允许用常量来表示特定的数据片断,而且全部都以类型安全的形式来表示. 初探枚举类 在程序设计中,有时会用到由若干个有限数据元素组成的集合,如一周内的星期一到星期日七个数据元素组成的集合,由三种颜色红.黄.绿组成的集合,一个工作班组内十个职工组成的集合等等,程序中某个变量取值仅限于集合中的元素.此时,可将这些数据集合定义为枚举类型. 因此,枚举类型是某类数据可能取值的集合,如一周内星期可能取值的

Java枚举类接口实战

枚举类可以实现一个或多个接口.与普通类实现接口完全一样,枚举类实现接口时,需要实现该接口所包含的方法. 如果需要每个枚举值在调用同一个方法时呈现不同的行为,则可以让每个枚举值在{...}匿名块中实现自己的业务逻辑. public interface IGradeHandler { String getGrade(String studentName); } public enum GradeHandlerEnum implements IGradeHandler { //five grade l

zend framework获取数据库中枚举类enum的数据并将其转换成数组

在model中建立这样的模型,在其中写入获取枚举类的方法 class Student extends Zend_Db_Table{ protected $_name ='student'; protected $_primary ='id'; function getPartyEnum($enumname){ //适配器并获取数据 $db = $this->getAdapter(); $db->query("SET NAMES GBK"); $sql = $db->q

java 枚举(enum)学习

之前没有用过枚举,不懂.今天找了些资料学习了,现在总结如下:(希望高手看到后批评指教) 枚举的作用: 1.限定某一类型的取值范围. 2.不再写public static final...(如果取值范围太广,就太麻烦了),但最终enum还是要转化成class类型,还是会加public static final... 一段代码说明为什么java要有enum类型: package good.good.study; public class EnumStudy2 { public static void