zoukankan      html  css  js  c++  java
  • Java 之 枚举(Enum)

    一、枚举

      1、概述

        枚举:JDK1.5引入的,类似于穷举,一一罗列出来

        Java 枚举:把某个类型的对象,全部列出来

        枚举类型的对象是有限、固定的几个常量对象。

      2、应用

        什么情况下会用到枚举类型?

        当某个类型的对象是固定的,有限的几个,那么就可以选择使用枚举。

        在整个系统的运行期间,有且只有这几个对象。

        例如: 性别类:只有两个对象:男,女

            季节类:有4个对象:春、夏、秋、冬

    二、JDK1.5之前,实现枚举效果

      1、需要把构造器私有化:

          目的:在这个类的外面,无法随意的创建对象

      2、在本类中,提前创建好对象,供别人使用

          Demo:

     1 public class TestEnum {
     2     public static void main(String[] args) {
     3         //Gender g1 = new Gender();   构造器私有化,无法使用
     4         
     5         Gender nan1 = Gender.NAN;
     6         Gender nan2 = Gender.NAN;
     7         System.out.println(nan1 == nan2);//true
     8     }
     9 }
    10 class Gender{
    11     //public:使得外面可以直接访问
    12     //static:使得可以使用“类名.”访问
    13     //final:前调这个对象是不可变
    14     public static final Gender NAN = new Gender("男");
    15     public static final Gender NV = new Gender("女");
    16     
    17     private String description;
    18     
    19     private Gender(String description){
    20         this.description = description;
    21     }
    22 }

    三、JDK1.5之后使用枚举

      1、定义格式

        (1)声明枚举类型

    【修饰符】  enum 枚举类型名{
        常量对象列表
    }

        (2)声明枚举类型2

    【修饰符】  enum 枚举类型名{
    	常量对象列表;
    	其他的成员列表
    }
    

                 说明

          ① 常量对象列表必须在枚举类型的首行;

          ② 如果常量对象列表后面还有其他的成员,那么需要在常量对象列表后面加 ;进行分割。

      2、枚举

        (1)枚举是一种类,是一种特殊的类,特殊在它的对象是有限的几个常量对象。

        (2)枚举类型不能继承其他类型,因为枚举类型有一个隐含的父类

           java.lang.Enum 是所有 Java 语言枚举类型的公共基本类。

      3、常用方法

        (1)构造方法

            Enum 类中有一个唯一的构造器

    protected  Enum(String name, int ordinal) 
    

             这个构造器不是程序员手动调用的,是编译器自动调用,在所有枚举类型的构造器的首行,并且自动传入 name 和 ordinal 的值。

            name:表示常量对象名称

            ordinal:表示常量对象的序号,其中初始常量序数为零

        (2)name() 与 ordinal() 方法

    String name():返回 常量对象名称
    int ordinal():返回 常量对象序数,即获取某个枚举对象的位置索引值,索引从0开始

        (3)toString() 方法

    String toString():在Enum类中重写了Object类的toString方法,返回常量对象名

          自定义的枚举类型,eclipse不能自动生成 toSring 方法,但是可以手动重写。因为IDE认为,父类的 toString方法已经很完美了。

        (4)values() 与 valueof() 方法

    枚举类型[] values():返回该枚举的所有枚举对象
    枚举类型   valueOf(String name):根据name常量对象名返回枚举对象

         (5)compareTo() 方法

    枚举对象.compareTo()  该方法用于比较两个枚举对象在定义时的顺序
    

          返回正值:代表方法中参数在调用该方法的枚举对象位置之前

           返回零:代表两个互相比较的枚举成员的位置相同

           返回负值:代表方法中参数在调用该方法的枚举对象位置之后

      

        Demo:

     1 public class TestEnum {
     2     public static void main(String[] args) {
     3         Season s = Season.SPRING;
     4         System.out.println(s);//自动调用toString
     5         
     6         System.out.println(s.name());
     7         System.out.println(s.ordinal());
     8         System.out.println("-----------------");
     9         
    10         Season[] all = Season.values();  //获取所有枚举对象
    11         for (int i = 0; i < all.length; i++) {
    12             System.out.println(all[i]);
    13         }
    14         
    15         System.out.println("-----------------");
    16         Season spring = Season.valueOf("SPRING");
    17         System.out.println(spring);
    18     }
    19 }
    20 enum Season{
    21     //常量对象后面没有(值)就是调用无参构造
    22     //常量对象后面有(值)就是调用有参构造
    23     SPRING("春暖花开"),SUMMER,FALL,WINTER;
    24     
    25     private String description;
    26 
    27     private Season() {
    28         
    29     }
    30 
    31     private Season(String description) {
    32         this.description = description;
    33     }
    34     // 手动重写 toString() 方法
    35     public String toString(){
    36         return name() + ":" + description;
    37     }
    38     
    39 }

    四、枚举类型的特点

      1、枚举类型有一个公共的基本的父类,是 java.lang.Enum 类型,所以不能再继承别的类型

      2、枚举类型的构造器必须是私有的

      3、枚举类型可以实现接口

             枚举实现接口要重写所有的抽象方法,所有对象可以都调用通用的重写方法,也可以调用各自重写的方法。

       Demo:

     1 public class TestEnum {
     2     public static void main(String[] args) {
     3         MyEnum a = MyEnum.A;
     4         a.test();
     5         
     6         MyEnum b = MyEnum.B;
     7         b.test();
     8     }
     9 }
    10 interface MyInter{
    11     void test();
    12 }
    13 enum MyEnum implements MyInter{       //每个对象各自重写方法
    14     A{
    15         @Override
    16         public void test() {
    17             System.out.println("aaa");
    18         }
    19     },B{
    20         @Override
    21         public void test() {
    22             System.out.println("bbb");
    23         }
    24     }
    25 }
    26 enum MyEnum1 implements MyInter{     //通用的方法
    27     A,B;
    28 
    29     @Override
    30     public void test() {
    31         System.out.println("test");
    32     }
    33 }

     五、父类 java.lang.Enum 类型

      1、构造器

    protected Enum(String name, int ordinal):由编译器自动调用

      2、String name(): 常量对象名

      3、int ordinal(): 返回常量对象的序号,第一个序号是0

      4、String toString(): 返回常量对象名,如果子类想重写,需要手动重写

      5、int compareTo(Object obj): 按照常量对象的顺序比较

    六、枚举类型的优势

      •   类型安全
      •     紧凑有效的数据定义
      •     可以和程序其他部分完美交互
      •     运行效率高
  • 相关阅读:
    运营活动总结
    《天天来塔防》游戏分析
    C++ 头文件与using namespace std
    cocos2dx -- 错误笔记(4)ntdll.dll堆已损坏
    大学,且行且珍惜
    cocos2dx -- 错误笔记(3)class类型重定义
    谈谈对HTML语义化的理解
    CSS深入研究:display的恐怖故事解密(2)
    We have a problem with promises
    react-组件生命周期
  • 原文地址:https://www.cnblogs.com/niujifei/p/11957034.html
Copyright © 2011-2022 走看看