19.枚举类型

本文详细介绍了Java枚举的各种高级用法,包括静态导入、在枚举中添加方法、与switch语句结合使用、利用values()和ordinal方法、实现接口而非继承、使用EnumSet和EnumMap等,并提供了具体示例。

1.静态导入enum
  public enum Spiciness{NOT,MILD,MEDIUM,HOT,FLAMING }
  在其他类中应用如果
  import static package.Spiciness.*;
  那么在直接用NOT就行,不用enum类型修饰enum的实例。
  如果enum在默认包里,或者在同一文件里,则无法使用这一特性。
2.enum中添加方法
  enum除了不能继承自一个enum,基本可以看成一个常规类。可以有方法,甚至有main方法。
所有的枚举值都是public,static,final
3.switch和enum结合
  如: enum Signal{GREEN,YELLOW,RED}
  Signal color=Signal.RED;
  switch(color){
   case Signal.RED: color = Signal.GREEN;
                    break;
   } 
4.enum的values()和oridinal
  所有enum都继承自ENUM类,但是ENUM类中没有values()方法,它是编译器加上的static方法。
  oridinal返回枚举值在枚举类中的顺序。
5.实现,而非继承
  enum都继承自java.lang.Enum类,所以不能再多重继承,只能实现一个或多个接口。
6.EnumSet 
   EnumSet必须和一个enum一起工作 

  例子:
  package enumerated;
  public enum AlarmPoints {
  STAIR1, STAIR2, LOBBY, OFFICE1, OFFICE2, OFFICE3,
  OFFICE4, BATHROOM, UTILITY, KITCHEN
  }   
 
 package enumerated;
import java.util.*;
import static enumerated.AlarmPoints.*;
import static net.mindview.util.Print.*;

public class EnumSets {
  public static void main(String[] args) {
    EnumSet<AlarmPoints> points =
      EnumSet.noneOf(AlarmPoints.class); // Empty set
    points.add(BATHROOM); //1.加单个值
    print(points);
    points.addAll(EnumSet.of(STAIR1, STAIR2, KITCHEN)); //2.加多个值
    print(points);
    points = EnumSet.allOf(AlarmPoints.class); //3.加所有值
    points.removeAll(EnumSet.of(STAIR1, STAIR2, KITCHEN)); //3.删除多个值
    print(points);
    points.removeAll(EnumSet.range(OFFICE1, OFFICE4)); //4.删除这个范围内的值
    print(points);
    points = EnumSet.complementOf(points); //5.去反
    print(points);
  }
} /* Output:
1.[BATHROOM]
2.[STAIR1, STAIR2, BATHROOM, KITCHEN]
3.[LOBBY, OFFICE1, OFFICE2, OFFICE3, OFFICE4, BATHROOM, UTILITY]
4.[LOBBY, BATHROOM, UTILITY]
5.[STAIR1, STAIR2, OFFICE1, OFFICE2, OFFICE3, OFFICE4, KITCHEN]

7.EnumMap
package enumerated;
import java.util.*;
import static enumerated.AlarmPoints.*;
import static net.mindview.util.Print.*;

interface Command { void action(); }

public class EnumMaps {
  public static void main(String[] args) {
    EnumMap<AlarmPoints,Command> em =
      new EnumMap<AlarmPoints,Command>(AlarmPoints.class);
    em.put(KITCHEN, new Command() {
      public void action() { print("Kitchen fire!"); } //加入键值对,值为匿名对象
    });
    em.put(BATHROOM, new Command() {
      public void action() { print("Bathroom alert!"); }
    });
    for(Map.Entry<AlarmPoints,Command> e : em.entrySet()) {
      printnb(e.getKey() + ": ");
      e.getValue().action();  //调用值对应的对象的方法
    }
    try { // If there's no value for a particular key:
      em.get(UTILITY).action();
    } catch(Exception e) {
      print(e);
    }
  }
} /* Output:
BATHROOM: Bathroom alert!
KITCHEN: Kitchen fire!
java.lang.NullPointerException
*///:~

8.常量相关的方法
  public enum ConstantSpecificMethod {
  DATE_TIME {
    String getInfo() {    //定义各自不同的行为
      return
        DateFormat.getDateInstance().format(new Date());
    }
  },
  CLASSPATH {
    String getInfo() {
      return System.getenv("CLASSPATH");
    }
  },
  VERSION {
    String getInfo() {
      return System.getProperty("java.version");
    }
  };
  abstract String getInfo();//为每个enum实例定义的抽象方法,也可以定义多个,然后每个实例实现。
  public static void main(String[] args) {
    for(ConstantSpecificMethod csm : values())
      System.out.println(csm.getInfo());
  }
}

<think>我们正在讨论枚举类型的赋值问题。根据引用内容,枚举类型在多种编程语言中都有应用,如Java和C语言。用户询问如何为枚举类型赋值,我们将从以下几个方面进行解释:1.定义枚举类型时赋值(显式赋值)2.定义枚举变量并赋值3.枚举常量的默认赋值规则4.枚举类型在数组和循环中的使用###1.定义枚举类型时赋值在定义枚举类型时,可以为枚举常量显式赋值。如果没有显式赋值,编译器会按照从0开始递增的规则自动赋值(除非前一个常量有赋值,则后续常量在前一个常量的基础上递增)。例如在C语言中(引用[4]和[5]):```c//显式赋值:MON=1,后续常量依次递增(TUE=2,WED=3,...)enumDAY{MON=1,TUE,WED,THU,FRI,SAT,SUN};//也可以部分显式赋值,部分自动递增enumExample{A=10,//显式赋值10B,//自动为11C=20,//显式赋值20D,//自动为21E=18,//显式赋值18(引用[5]的例子)F//自动为19};```在Java中(引用[1]和[2]),枚举常量的赋值方式类似,但语法不同:```javapublicenumSeason{SPRING(1),//通过构造函数赋值SUMMER(2),AUTUMN(3),WINTER(4);privateintcode;//枚举的构造函数privateSeason(intcode){this.code=code;}publicintgetCode(){returnthis.code;}}```###2.定义枚举变量并赋值定义枚举变量后,可以将枚举常量赋值给该变量。在C语言中(引用[4]):```cenumDAYday;//声明一个枚举变量day=MON;//赋值//或者直接初始化enumDAYtoday=TUE;```在Java中(引用[1]):```javaSeasoncurrentSeason=Season.SPRING;```###3.枚举常量的默认赋值规则-如果枚举类型中的第一个常量没有赋值,则默认为0。-后续常量如果没有显式赋值,则在前一个常量的基础上加1(无论前一个常量是显式赋值还是默认赋值)。###4.枚举类型在数组和循环中的使用枚举类型可以用于数组,也可以通过循环遍历(如引用[1]中Java的例子)。在Java中,可以使用`values()`方法获取枚举常量的数组:```javaSeason[]seasons=Season.values();for(Seasons:seasons){System.out.println(s);//输出枚举常量的名字//或者输出其关联的值System.out.println(s.getCode());}```在C语言中,枚举类型本身并不直接支持遍历所有常量,但可以通过一些技巧实现(比如定义数组,或者使用宏等),但这不是标准支持。###注意事项-在C语言中,枚举变量可以赋值为超出枚举定义范围的整数值(引用[3]),但这是不安全的,可能导致未定义行为。因此,应确保赋值在枚举定义的范围内。-在Java中,枚举类型是类型安全的,不能将整数值直接赋给枚举变量(除非通过自定义方法转换)。###总结为枚举类型赋值主要包括两个层面:1.定义枚举常量时的赋值(显式或默认)。2.定义枚举变量并为其赋予枚举常量。不同编程语言在枚举的实现上有所不同,但核心概念相似。§§相关问题§§1.枚举类型在C语言和Java中的主要区别是什么?2.如何遍历枚举类型的所有值?3.枚举类型与常量定义(如使用#define或const)相比有什么优势?4.在Java中如何通过整数值获取对应的枚举常量?</think>### 枚举类型赋值详解 枚举类型是一种特殊的数据类型,允许用一组命名常量表示有限的值集合。以下是不同编程语言中的枚举赋值方法: #### 一、C语言枚举赋值 1. **定义时赋值**(引用[4][5]): ```c // 显式赋值 enum Weekday { MON = 1, // 显式赋值1 TUE, // 自动递增为2 WED = 5, // 显式赋值5 THU, // 自动递增为6 FRI }; // 使用枚举变量 enum Weekday today = WED; // today值为5 ``` 2. **赋值规则**: - 首个常量默认为0(未显式赋值时) - 后续常量自动+1递增 - 可任意中断自动递增(引用[5]) > 注意:C允许超范围赋值(引用[3]): > ```c > enum SmallEnum { A=0, B=1 }; > enum SmallEnum x = 100; // 允许但危险 > ``` #### 二、Java枚举赋值(引用[1][2]) ```java // 定义带值的枚举 public enum Season { SPRING(1), SUMMER(2), AUTUMN(3), WINTER(4); // 注意分号 private final int code; // 构造函数赋值 private Season(int code) { this.code = code; } public int getCode() { return code; } } // 使用枚举 Season current = Season.SUMMER; System.out.println(current.getCode()); // 输出2 ``` #### 三、通用赋值原则 1. **类型安全**:Java禁止非枚举值赋值,C可能允许但违反类型安全 2. **取值方法**: - Java:`enumInstance.value` - C:直接作为整数使用 3. **遍历枚举**(引用[1]): ```java for(Season s : Season.values()) { System.out.println(s.name() + ": " + s.getCode()); } ``` #### 四、最佳实践 1. **优先使用命名常量**而非直接数值 2. **Java中**通过构造函数关联附加数据 3. **C语言中**避免超出枚举定义范围的赋值 > 关键区别:Java枚举是类对象(支持方法),C枚举本质是整型常量(引用[4])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值