Java枚举详解

文章介绍了Java中枚举的用途,作为替代常量表示固定值的更安全方式。枚举的格式、特点和方法被详细阐述,包括如何定义枚举类,枚举项的访问,以及如`name()`、`ordinal()`、`compareTo()`、`toString()`等枚举方法的使用。同时,文章还展示了枚举类中定义成员变量、构造器和抽象方法的例子。
摘要由CSDN通过智能技术生成

一.枚举

  1.为什么有枚举?

如果我们的程序需要表示固定的几个值:

比如季节:spring (春),summer(夏),autumn(秋),winter(冬)

用常量表示:

        public static final int SEASON_SPRING = 1;
        public static final int SEASON_SUMMER = 2;
        public static final int SEASON_AUTUMN = 3;
        public static final int SEASON_WINTER = 4;

用常量表示季节的弊端

 1.代码不够简洁

 2.不同类型的数据是通过名字区分的

 3.不安全,由于是数字类型,就有可能使用这几个值做一些运算操作;比如:

SEASON_SPRING + SEASON_SUMMER

为了间接的表示一些固定的值,Java就给我们提供了枚举。

2.枚举的格式

概念:

       枚举:是指将变量的值一一列出来,变量的值只限于列举出来的值的范围内。

格式:

      public  enum  s {

                       枚举项1,枚举项2,枚举项3;

       }

定义枚举类要用关键字enum

练习:

   定义一个枚举类,用来表示春,夏,秋,冬这四个固定值

package com.gch.d5_enum.demo1;

/**
   定义枚举类
 */
public enum Season {
    SPRING,SUMMER,AUTUMN,WINTER;
}

3.枚举的特点

   1.所有枚举类都是Enum的子类
   2.我们可以通过"枚举类名.枚举项名称"去访问指定的枚举项
   3.每一个枚举项其实就是该枚举的一个对象
   4.枚举也是一个类,也可以去定义成员变量
   5.枚举类的第一行上必须是枚举项,最后一个枚举项后的分号是可以省略的,
      但是如果枚举类有其他的东西,这个分号就不能省略。建议不要省略

   6.枚举类可以有构造器,但必须是private的,它默认也是private的。
      枚举项的用法比较特殊:枚举("");
  
7.枚举类也可以有抽象方法,但是枚举项必须重写该方法。

   8.如果枚举项的后面什么都不写,那么此时它就默认调用枚举项的空参构造,如果想让它不        报错,只有让每一个枚举项去调用有参构造:枚举项(参数1,参数2){}

package com.gch.d5_enum.demo2;

/**
   定义枚举类
 */
public enum Season {
    // 5.枚举类的第一行上必须是枚举项,最后一个枚举项后的分号是可以省略的,
    //   但是如果枚举类有其他的东西,这个分号就不能省略。建议不要省略

    // 如果枚举项的后面什么都不写,那么此时它就默认调用枚举项的空参构造
    // 如果想让它不报错,只有让每一个枚举项去调用有参构造:枚举项(参数1,参数2){}
    SPRING("春"){
        // 如果枚举类中有抽象方法
        // 那么在枚举项中必须要全部重写
        @Override
        public void show() {
            System.out.println(this.name);
        }
    },
    SUMMER("夏"){
        @Override
        public void show() {
            System.out.println(this.name);
        }
    },
    AUTUMN("秋"){
        @Override
        public void show() {
            System.out.println(this.name);

        }
    },
    WINTER("冬"){
        @Override
        public void show() {
            System.out.println(this.name);
        }
    };

//    4.枚举也是一个类,也可以去定义成员变量
    public String name;

    // 空参构造
//    private Season(){}

    // 有参构造
    private Season(String name){
        this.name = name;
    }

    // 抽象方法
    public abstract void show();
}
package com.gch.d5_enum.demo2;

public class EnumDemo {
    public static void main(String[] args) {
        // 第二个特点的演示
        // 2.我们可以通过"枚举类名.枚举项名称"去访问指定的枚举项
        System.out.println(Season.SPRING);
        System.out.println(Season.SUMMER);
        System.out.println(Season.AUTUMN);
        System.out.println(Season.WINTER);

        // 第三个特点的演示
        //  3.每一个枚举项其实就是该枚举的一个对象
         Season spring = Season.SPRING;
    }
}

 4.枚举的方法

  1. String name() 获取枚举项的名称
  2. int ordinal() 返回枚举项在枚举类中的索引值, 枚举项在枚举类中它也是有索引的
  3. int compareTo(E o) 比较两个枚举项,返回的是索引值的差值
  4. String toString() 返回枚举常量的名称
  5. static <T> T valueOf(Class<T> type,String name)

                                          字节码文件对象  枚举项的名称
           ,它是一个静态方法,获取指定枚举类中的指定名称的枚举值

     6. values()  获得所有的枚举项

package com.gch.d5_enum.demo3;

/**
   定义枚举类
 */
public enum Season {
    SPRING,SUMMER,AUTUMN,WINTER;
}
package com.gch.d5_enum.demo3;

public class EnumDemo {
    public static void main(String[] args) {
        // String name() 获取枚举项的名称
         String name = Season.SPRING.name();
         System.out.println(name); // SPRING
        System.out.println("---------------------");

        // int ordinal() 返回枚举项在枚举类中的索引值
         int index1 = Season.SPRING.ordinal();
         int index2 = Season.SUMMER.ordinal();
         int index3 = Season.AUTUMN.ordinal();
        int index4 = Season.WINTER.ordinal();
        // 枚举项在枚举类中它也是有索引的
        System.out.println(index1); // 0
        System.out.println(index2); // 1
        System.out.println(index3); // 2
        System.out.println(index4); // 3
        System.out.println("----------------------");

        // int compareTo(E o) 比较两个枚举项,返回的是索引值的差值
        int result = Season.SPRING.compareTo(Season.WINTER);
        System.out.println(result); // 0 - 3 = -3
        System.out.println("-----------------------");

        // String toString() 返回枚举常量的名称
        String s = Season.SPRING.toString();
        System.out.println(s); // SPRING
        System.out.println("------------------");

        // static <T> T valueOf(Class<T> type,String name)
        //                      字节码文件对象  枚举项的名称
        // 它是一个静态方法,获取指定枚举类中的指定名称的枚举值
        Season spring = Enum.valueOf(Season.class, "SPRING");
        System.out.println(spring); // SPRING
        System.out.println(Season.SPRING == spring); // true
        System.out.println("--------------------------");

        // values()  获得所有的枚举项
        Season[] values = Season.values();
        for (int i = 0; i < values.length; i++) {
            System.out.println(values[i]);
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GaoSSR

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值