javaSE基础enum枚举刨析

发布于 2020-10-19  433 次阅读


Emun是java1.5新增的内容,它和class与interface在java中的地位是一样的,只是三种应用场景不一样,它的出现是为了简便我们对常量和固定类的调用
Emun类的用途:
                        1,类的个数是有限的且是固定的
                        2,对一个或一组常量的定义
Emun类的特性:
                        1,Emun默认继承java.lang.Enum类,而不是object类
                        2,Emun的所有对象实例,都默认被添加了public static final
                        3,Emun的构造方法是private的,不能被外部实例化
                        4,Emun不能继承,但可以多接口实现
                        5,Emun类不能被继承
自定义枚举类:
emun类其实也是对类的封装,只是它自己给了我们一个模板
public class customemun  {
       //定义属性
       private  final String WQL;
       private  final String FQ;
       //私有化构造方法
    private customemun(String WQL,String FQ){
             this.WQL=WQL;
             this.FQ=FQ;

       }

     public String getWQL() {
             return WQL;
       }

       public String getFQ() {
             return FQ;
       }

       //提供枚举对象实例
       static final customemun ONE=new customemun("晴天","LOVE");
       static final customemun TWO=new customemun("雨天","DISLIVE");
       
      @Override
       public String toString() {
             return "customemun [WQL=" + WQL + ", FQ=" + FQ + "]";
       }
}

一,Emun类的使用

一,语法规范

1,枚举类的枚举实例只能在类的最前面
2,多个枚举实例中间有逗号( , )隔开,结尾用分号( ; )结束
//正确写法
public enum emunwql  {
       WQL,
       FQ;       
       private int a;
       private String b;}

//错误写法
public enum emunwql  {
       private int a;
       private String b;
       WQL;
       FQ;
       }

二,构造方法和toString方法

枚举类的实例是本类的实现,系统默认是以public static final修饰
public enum emunwql  {
       //枚举对象实例
       WQL(1,"LOVE"),
       FQ(2,"FQ");
      
       private int a;
       private String b;
     
     //构造方法

       private emunwql(int a,String b) {
             this.a=a;
             this.b=b;
       }
      
       public int getA() {
             return a;
       }
       public String getB() {
             return b;
       }

        

        //重写toString方法,这不是object的,而是Emun类的

       @Override

       public String toString() {

             return a+"--"+b;

       }

       }
测试:
public class test1 {
       public static void main(String[] args) {
             System.out.println(emunwql.WQL);
             System.out.println(emunwql.WQL.getA());
       }
}
输出:
 1--LOVE
1

三,Emun的方法

1,ordinal方法:
返回序号,默认从0开始
源码:
public final int ordinal() {
        return ordinal;
    }
//默认每一个枚举实例对象都有一个序号
  protected Enum(String name, int ordinal) {
        this.name = name;
        this.ordinal = ordinal;
    }

例:

emunwql.WQL.ordinal();
//结果为 0
2,compareTO方法:
比较常量序号大小,并返回一个差值
compareTO源码:
public final int compareTo(E o) {
        Enum<?> other = (Enum<?>)o;
        Enum<E> self = this;
       //判断class类对象是否一致
        if (self.getClass() != other.getClass() && // optimization
            self.getDeclaringClass() != other.getDeclaringClass())
            throw new ClassCastException();
       //如果一致就返回序数的差值
         return self.ordinal - other.ordinal;
    }
例:
emunwql.WQL.compareTo(emunwql.FQ);
//结果为 -1  emun类在二中
4,getDeclaringClass方法
返回实例的类对象
源码:
@SuppressWarnings("unchecked")
   public final Class<E> getDeclaringClass() {
    //调用了class方法
        Class<?> clazz = getClass();
        Class<?> zuper = clazz.getSuperclass();
        return (zuper == Enum.class) ? (Class<E>)clazz : (Class<E>)zuper;
    }
例:
emunwql.WQL.getDeclaringClass()

5,values方法


结果:

class 枚举.emunwql

eunwql[] a=emunwql.WQL.values();
//返回一个对象实例数组
for(emunwql l:a) {
                    System.out.println(l.name());
             }
结果:
WQL
FQ

四,emun实现接口

package 枚举;
public enum emunwql implements emunfq {
       //方式一:mming内部类实现
       WQL(1,"LOVE"){
             @Override
             public void emun1() {                    
             };
       },

       FQ(2,"FQ"){
             @Override
            public void emun1() {};
       };       
       private int a;

       private String b;
      
       private emunwql(int a,String b) {
             this.a=a;
             this.b=b;
       }
      
       public int getA() {
             return a;
       }

       public String getB() {
             return b;
       }

       @Override
       public String toString() {
             return a+"--"+b;
       }   

       //方式二:
       @Override
      public void emun1() {};
}

五,emun源码

将类反编译:
注:是emun实现接口的源码反编译而来