枚举

本文深入探讨Java中的枚举类型,介绍枚举的基本概念、声明和使用方式,以及枚举类型的内部实现机制。同时,文章详细讲解了枚举类型如何增强代码的可读性和安全性,包括枚举的构造方法、成员变量、方法和继承特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

枚举

  • 枚举在C/C++/c#,还有Objective-C中,是一个被命名的整型常数的集合,枚举在日常生活中很常见。例如表示星期的SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY,SATURDAY, 就是一个枚举。
  • 在应用程序开发中,经常涉一个变量的取值范围为一组固定的常量的集合。例如:字体的大小、线条的样式等。为此,java语言引入了枚举类型。
    例如:声明一个名为Size的枚举类型,该枚举类型具有三个枚举值;SMALL、MEDIUM和LARGE.
enum Size{
SMALL,
MEDIUM,
LARGE;
}

声明枚举其实就是定义一种特殊形式的类,但不能通过关键字new创建其对象实例。枚举类型的枚举值是(SMALL,MEDIUM,LARGE)是Size的类对象实例。

例如:Size size = Size.SMALL;
  • 枚举成员默认都是public static final的,即常量。因此,按命名规则,枚举类中的枚举值全部大写。
  • java类库中提供了大量的枚举类型。使用枚举类型,可以限制取值范围有限、固定的一组命名常量,提高编程效率,并降低程序出错的几率。

枚举的声明和使用

1、简单枚举的声明和使用
Java使用关键字enum声明枚举。

【枚举修饰符】enum枚举名{
         枚举体【;】
         }【;】

2、枚举规范
(1)【枚举修饰符】(可选):枚举声明的修饰同样的意义,符与类声明的修饰符具有同样的意义。在枚举声明中,只允许public,不允许abstract和final修饰符,枚举不能是抽象的,也不允许派生。
(2) enum:关键字,注意首字母小写;
(3)枚举名:所要定义的枚举的标识符,必须符合标识符的命名规则,一般采用PascalCase命名规范,例如:WeekDays.
(4)枚举体:用于定义零个或多个枚举值,枚举值以英文逗号分隔。这些枚举值是该枚举类型的对象实例,任意两个枚举值不能有相同的名字。
例如:

 enum MyColor{
      RED,GREEN,BIUE;
}
  • 访问枚举的方式与访问静态常量字段类似,其基本类型为:
    “ 枚举名,枚举成员”
    例如:
Mycolor color = Mycolor.RED;
  • 枚举值可以直接使用操作符(==)进行比较。
    例如:
Mycolor color1= Mycolor.BIUE;
if(color1 == Mycolor.RED){
System.out.println("color1 is red");
}else{
System.out.println("color1 is not red");
}
  • 枚举值可以用于switch…case语句,枚举是一个抽象类。
    例如:
Mycolor color2 = Mycolor.RED;
switch(color2){
case RED:
System.out.println("color2 is red");break;
case GREEN:
System.out.println("color2 is green);break;
case BIUE:
System.out.println("color2 is blue);break;
}
示例一
 enum MyColor{
      RED,GREEN,BIUE;
}
public class EnumTest1{
public static void main(String[] args){
 Mycolor color1 = Mycolor.BIUE;
 if(color1 == Mycolor.RED){
System.out.println("color1 is red");
}else{
System.out.println("color1 is not red");
}
Mycolor color2 = Mycolor.RED;
switch(color2){
case RED:
System.out.println("color2 is red");break;
case GREEN:
System.out.println("color2 is green);break;
case BIUE:
System.out.println("color2 is blue);break;
}
}
运行结果:
        color1 is not blue
        color2 is red

3、声明枚举类型的其他成员
在枚举类型中,除了声明枚举值之外,还可以声明其他类成员,包括构造方法、方法和数据成员。
注意:枚举类的构造方法与一般类的构造方法不同,枚举类构造方法的访问修饰符只能为private(声明时可以省略private,因为默认的就是private),构造方法只是在构造枚举值得时候被调用。

  • 枚举不可以产生实例对象 new 原因:自定义的枚举,都是继承 enum
enum Mycolor2{   //枚举类
RED(255,0,0),GREEN(0,225,0),BIUE(0,0,225);
//私有构造方法,用于构造枚举值,例如RED(225,0,0)
private Mycolor(int rv, int gv, int bv){   //枚举类型的构造方法为private
             this.redValue = rv;
             this.greenValue = gv;
             this.biueValue = bv;
     }
     public String toString(){
             return super.toString() + "(" + redValue  + " , " + greenValue  + " , " + biueValue  + " ) ";
     }
     //成员变量
     private int redValue  ;
     private int greenValue  ;
     private int biueValue;
}
public class EnumTest {    
        public static void main(String[] args)  {
                  //Color color1 = new Color();    //编译错误:不能使用new关键字创建枚举类的对象实例
                  Mycolor2 color = Mycolor.BIUE;
                  System.out.println(color);    //隐式调用toString()方法
                  System.out.println(color.toString());      //调用toString()方法
         } 
}
运行结果:
                BIUE(0,0,225)
                BIUE(0,0,225)
  • 在上述示例中,枚举类型Color声明了三个private成员变量,一个私有构造方法,重写了从基类继承的成员方法toString().

枚举类的成员方法

所有的枚举类型都隐式的继承于Enum类(java.lang.Enum),故所有枚举类都继承了Enum类的方法。声明枚举类型时,编译器会自动提供相应方法的实现。
假设 Colors为一下的枚举类型:

enum MyColors{
      RED,GREEN,BIUE;
}
 Mycolors color1 = Mycolors.RED;
1、int ordinal()
  • 返回枚举常量的序数(在枚举声明中的位置,其中初始常量序数为零),相当于下标
 enum Color{
    RED,GREEN,WHITE,BLACK
}
public class TestDemo1 {
    public static void main(String[] args) {
        Color color = Color.BLACK;
        Color color2 = Color.RED;
        System.out.println(color.ordinal());
        }
        }
  运行结果:
          3
2、int compareTo(E o)
  • 比较此枚举与指定对象的顺序。在该对象小于、等于或大于指定对象时,分别返回负整数、零或正整数。枚举常量只能与枚举类型的其他枚举常量进行比较,否则会产生编译错误。
enum Color{
   RED,GREEN,WHITE,BLACK
}
public class TestDemo1 {
   public static void main(String[] args) {
       Color color = Color.BLACK;
       Color color2 = Color.RED;
     System.out.println(color2.compareTo(color));
     //值和地址都不同
     System.out.println(color1.equals(color2));  //false
     System.out.println(color1 == color2);  //false
    }
    }
        运行结果:
                 -3
3、String name()
  • 返回次枚举常量的名称
 enum Color{
    RED,GREEN,WHITE,BLACK
}
public class TestDemo1 {
    public static void main(String[] args) {
        Color color = Color.BLACK;
        Color color2 = Color.RED;
     System.out.println(color.name());
     }
     }         
     运行结果:
                BLACK
4、String toString()
  • 返回枚举常量的名称
enum Color{
    RED,GREEN,WHITE,BLACK
}
public class TestDemo1 {
    public static void main(String[] args) {
        Color color = Color.BLACK;
        Color color2 = Color.RED;
     System.out.println(color.toString());   
     System.out.println(color);   //隐式调用String  toString()方法
     }
     }
     运行结果:
              BLACK
              BLACK

5、valueOf

  • 返回带指定名称的指定枚举类型的枚举常量。可以重写此方法
enum Color{
    RED,GREEN,WHITE,BLACK
}
public class TestDemo1 {
    public static void main(String[] args) {
        Color color = Color.BLACK;
        Color color2 = Color.RED;
    System.out.println(Color.valueOf("BLACK"));
    //重写valueOf()方法
        Color color3 = Color.valueOf("BLACK");
    System.out.println(color3);
    }
        }
     运行结果:
              BLACK
              BLACK
6、values()
  • 返回一个该枚举类的数组,其中数组的元素即为该枚举元素列表中的元素。
    == values()是编译器创造的静态方法==
enum Color{
    RED,GREEN,WHITE,BLACK
}
public class TestDemo1 {
    public static void main(String[] args) {
        Color color = Color.BLACK;
        Color color2 = Color.RED;
    Color[] colors = Color.values();
    for (int i = 0; i < colors.length; i++) {
        System.out.println(colors[i]);
    }
}
  }
  运行结果:
           RED
           GREEN
           WHITE
           BLACK
enum Color{
    RED,GREEN,WHITE,BLACK
}
public class TestDemo1 {
    public static void main(String[] args) {
        Color color = Color.BLACK;
        Color color2 = Color.RED;  
    for (Color c : Color.values()) {
        System.out.println(c + ",");
    }
    for (Color c : Color.values()) {
        System.out.print(c);
    }
}
   }
   运行结果:RED,GREEN,WHITE,BLACK,RED
   
            GREEN
            WHITE
            BLACK
            RED
7、得到这个类名
enum Color{
    RED,GREEN,WHITE,BLACK
}
public class TestDemo1 {
    public static void main(String[] args) {
        Color color = Color.BLACK;
        Color color2 = Color.RED;  
        System.out.println(color.getDeclaringClass());
    }
 }
 运行结果:
           class Color
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值