了解什么是枚举(enumeration)

本文介绍了Java中的枚举类型,包括枚举的定义、创建自定义枚举的步骤、枚举的特性以及如何在代码中使用枚举。枚举是一种特殊的类,用于定义一组固定的常量,可以实现接口并拥有自己的方法。枚举类默认继承自`Enum`类,枚举对象是静态的,并且可以通过`.values()`获取所有枚举实例。示例代码展示了如何创建枚举、遍历枚举以及使用枚举常量的方法。

1、枚举是一组常量的集合。还可以看成包含有限特定的对象。

2、自定义枚举的步骤:

  •  将构造器私有化private
  • 将get方法拿掉
  • 在类的内部直接创建固定的对象,比如:
  • public static Season SPRING = new Season("春天","温暖");
  • 使用:Season.SPRING,这个使用时最重要的
  • 优化:public final static Season SPRING = new Season("春天","温暖");

3、final修饰的变量一般都是大写。

4、在本类创建对象 



使用enumeration关键字实现枚举

1、使用关键字enum替代class。使用这个关键字后默认继承Enum类,因此枚举类不能在继承其他的类了。但是可以实现接口。

2、常量名(实参列表):SPRING("春天","温暖");直接和构造器匹配。有多个常量对象。中间用,号间隔。

        eg:

//常量对象要写在最前面
SPRING("春天","温暖"),WINTER("冬天","冷");
private String name ;
private String  desc;

//下面就是构造器

3、注意事项

  •  使用enum关键字创建枚举类的时候,会默认继承Eunm类。
  • 如果使用无参构造器,后面的括号可以不写。
  • 枚举之间用,好分隔。
  • 枚举对象放在行首。
  • 枚举对象是静态性质的,所以我们可以知道要是赋值的话其实是一个地址。

 4、常用的方法

 

 增强for循环:

for (int i :nums){
    sout("i = " + i);
}

//就是将数组中nums的值取出来赋值给i,知道取出最后一个i。

 

package enumeration;

public class eum01 {


    public static void main(String[] args) {
        //给他一个索引
        Season spring = Season.SPRING;
        //给他一个索引,觉得
        System.out.println(spring.name());
        System.out.println("次序  " + spring.ordinal());
        System.out.println("######");

        final Season[] values = Season.values();
        //遍历枚举类中的信息
        for(Season i :values){
            System.out.println(i);
        }
        //增强for循环
        final Season spring1 = Season.valueOf("SPRING");


        System.out.println(Season.SPRING.compareTo(Season.SUMMER));
        //Season.SPRING   换成上面的spring也是可以的,其实还是最底层的东西啊。
        //做减法
    }
}

enum Season{
    SPRING("春天","我爱你春天"),SUMMER("夏天","夏天的风吹动");


    private String name;
    private String dsc;

    @Override
    public String toString() {
        return "Season{" +
                "name='" + name + '\'' +
                ", dsc='" + dsc + '\'' +
                '}';
    }

    Season(String name, String dsc) {
        this.name = name;
        this.dsc = dsc;
    }
}

<think> 我们正在讨论枚举类型的定义。根据引用内容,枚举类型在C语言中是一种用户自定义类型,用于定义一组命名的整数常量。枚举类型可以提高代码的可读性和可维护性,因为可以使用有意义的名称代替数字。 枚举类型的定义语法如下: enum 枚举名 { 枚举常量1, 枚举常量2, ... 枚举常量n }; 其中,枚举常量是标识符,用逗号分隔。默认情况下,第一个枚举常量的值为0,后续每个枚举常量的值依次递增1。但是,也可以显式地给枚举常量赋值。 例如,定义一个表示星期的枚举类型: enum Weekday { MON, // 0 TUE, // 1 WED, // 2 THU, // 3 FRI, // 4 SAT, // 5 SUN // 6 }; 也可以显式赋值: enum Weekday { MON=1, TUE, // 2 WED, // 3 THU=10, FRI, // 11 SAT, // 12 SUN // 13 }; 枚举变量可以声明为: enum Weekday today = MON; 注意: 1. 枚举元素不是字符串常量,也不是字符常量,使用时不能加单引号或双引号(引用[3])。 2. 枚举类型在C语言中本质上是整数类型,因此枚举变量和常量可以用在整数可以用的地方,但这样会降低类型安全性。 另外,引用[1]提到了枚举类(在C++等语言中),但用户的问题是关于C语言的枚举类型定义,因此我们主要参考引用[2][3][4]。 下面是一个C语言的枚举类型定义和使用的例子(参考引用[3]和[4]): ```c #include <stdio.h> // 定义枚举类型 enum Color { RED, GREEN, BLUE }; int main() { enum Color c = RED; // 声明枚举变量并初始化 printf("RED: %d\n", c); // 输出: 0 c = GREEN; printf("GREEN: %d\n", c); // 输出: 1 // 也可以直接使用枚举常量 printf("BLUE: %d\n", BLUE); // 输出: 2 return 0; } ``` 在C语言中,枚举类型定义后,使用枚举变量需要加上enum关键字(除非使用typedef重新定义)。例如,上面的代码中,我们使用`enum Color`来声明变量。 如果需要省略enum关键字,可以使用typedef: ```c typedef enum { RED, GREEN, BLUE } Color; // 然后就可以直接使用Color作为类型名 Color c = RED; ``` 总结枚举类型的定义: 1. 使用enum关键字定义枚举类型,后面跟着枚举名和一对大括号,括号内是枚举常量列表,用逗号分隔。 2. 枚举常量默认从0开始,依次递增1,也可以显式赋值。 3. 枚举变量只能取枚举类型中定义的常量值。 4. 枚举常量在编译时会被替换为整数值,因此它们可以用于整数表达式。 注意:C语言中的枚举类型与C++中的枚举类(enum class)不同,C++的枚举类提供了作用域和类型安全等特性,而C语言的枚举类型相对简单。 现在,根据用户的问题,他/她想了解枚举类型的定义,我们已经给出了详细的解释和示例。 §§相关问题§§ 1. C语言中枚举类型和宏定义有什么区别? 2. 枚举类型在内存中是如何表示的? 3. 如何遍历枚举类型的所有值? </think> ### 枚举类型的定义详解 枚举类型(Enumeration Type)是一种用户自定义的数据类型,用于定义一组命名的整数常量。它在C/C++等语言中用于提高代码可读性和可维护性,避免使用魔术数字(Magic Numbers)。以下是基于引用内容的详细解释: #### 1. **基本语法结构** 枚举类型的定义包含三个核心部分: ```c enum 枚举名 { 枚举常量1, 枚举常量2, ... }; ``` - **枚举名**:自定义的类型名称(如 `Weekday`) - **枚举常量**:用逗号分隔的命名常量(如 `sun`, `mon`),默认从0开始自动递增[^2][^4] - **分号规则**:若枚举定义后紧跟变量声明,需以分号结束(如 `enum Color {RED, GREEN} c;`) #### 2. **关键特性与规则** - **常量值规则**: - 默认从0开始连续赋值(`sun=0`, `mon=1`, `tue=2`...) - 支持显式赋值覆盖(如 `enum {RED=1, GREEN=5, BLUE=10}`) - 未显式赋值的常量继承前一项值+1 - **作用域限制**: - 枚举常量具有全局作用域,定义后可直接使用(如 `weekday day = mon;`) - 不同枚举中的常量名不可重复(如两个枚举都定义 `RED` 会冲突) - **类型安全**: - 枚举变量只能赋值为枚举内定义的常量(如 `day = 100;` 会编译报错) - 枚举常量不是字符串或字符,使用时无需引号(错误示例:`day = "mon";`)[^3] #### 3. **内存表示与底层原理** 枚举类型在内存中以 **整数(int)** 形式存储: - 每个枚举常量对应一个整数值(如 `sun` 存储为 `0`) - 枚举变量本质是整数变量(`sizeof(enum Weekday)` 等于 `sizeof(int)`) - 赋值时会进行隐式类型转换(如 `int a = sun;` 合法) #### 4. **使用示例** **示例1:基础定义与赋值** ```c // 定义枚举类型 enum Weekday { sun, mon, tue, wed, thu, fri, sat }; int main() { enum Weekday today = mon; // 声明变量并赋值 printf("Today: %d\n", today); // 输出:1(mon的整数值) } ``` **示例2:显式赋值与遍历** ```c enum PrimaryColor { RED=1, GREEN=2, BLUE=4 }; // 显式赋值 int main() { for (int i = RED; i <= BLUE; i++) { printf("Color value: %d\n", i); // 输出:1, 2, 3, 4 } } ``` **示例3:枚举数组的应用**[^3] ```c enum Body { a, b, c, d }; int main() { enum Body month[31]; // 声明枚举数组 enum Body j = a; for (int i = 0; i < 30; i++) { month[i] = j; j = (j + 1) % 4; // 循环赋值 a,b,c,d } } ``` #### 5. **设计规范与最佳实践** - **命名规范**:常量名全大写,下划线分隔(如 `WEEKDAY_MON`)[^1] - **注释要求**:每个枚举常量需注释说明用途(如 `/* 周一 */ mon`) - **工程实践**: - 避免在头文件中定义枚举(防止多文件包含冲突) - 优先使用枚举而非 `#define`(提升类型安全) - **限制**: - 不支持泛型(如 `enum Color<T> {...}` 非法)[^1] - C语言中枚举不能定义方法(C++的枚举类可扩展方法) #### 6. **枚举 vs 宏定义** | 特性 | 枚举类型 | 宏定义(#define) | |--------------|------------------------------|----------------------------| | **类型安全** | 是(编译器检查) | 否(文本替换) | | **调试支持** | 常量名可见(调试器显示名称) | 替换为数字(不可见原名) | | **作用域** | 遵守作用域规则 | 全局生效(易命名冲突) | | **值关联** | 自动递增,逻辑关联 | 需手动维护数字关系 | ### 总结 枚举类型通过**命名常量集合**替代魔术数字,增强代码可读性和可维护性。其核心优势在于类型安全和逻辑关联性,适用于状态码、选项标志等场景(如系统调用的 `SYSTEM_INFORMATION_CLASS`[^5])。开发时需注意命名规范与作用域规则,避免隐式整型转换带来的风险。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值