Java-枚举

目录

引入:

自定义枚举:

Enum关键字实现枚举:

Enum原理:

Enum常用方法:

注意


引入:

什么是枚举:

        枚举是一个被命名的整型常数的集合,用于声明一组带标识符的常数。

public class eunmTest1 {
    public static void main(String[] args) {
        Season spring = new Season("春天", "温暖");
        Season summer = new Season("夏天", "热");
        Season autumn = new Season("秋天","凉快");
        Season winter = new Season("冬天","冷");
        //对于季节而言,它的对象是固定的四个,不会有更多的,这样设计Season,不能体现出季节只有四种
        Season red = new Season("h","s");
        //因此需要使用枚举
    }
}

class Season{
    private String name;
    private String desc;//描述

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }
}

 

自定义枚举:

public class enumTest3 {
    public static void main(String[] args) {
        System.out.println(Season1.SPRING);
        System.out.println(Season1.SUMMER);
        System.out.println(Season1.AUTUMN);
        System.out.println(Season1.WINTER);
    }

}
//自定义枚举实现
class Season1{
    //1:将构造器私有化,防止被new出来
    //2:去掉set方法,防止该类属性被修改
    //3:在该类内部创建固定的对象
    //4:可以加入final关键字
    //对外暴露对象:public final static

    private String name;
    private String desc;//描述

    //定义四个对象:
    public static final Season1 SPRING=new Season1("春天","暖");
    public static final Season1 SUMMER=new Season1("夏天","热");
    public static final Season1 AUTUMN=new Season1("秋天","凉");
    public static final Season1 WINTER=new Season1("冬天","冷");

    private Season1(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }

    public String getName() {
        return name;
    }

    public String getDesc() {
        return desc;
    }

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

 

Enum关键字实现枚举:

public class enumTest2 {
    public static void main(String[] args) {
        System.out.println(Season2.SPRING);
        System.out.println(Season2.SUMMER);
    }
}

enum Season2{
    //1:使用关键字enum代替class
    //2:public static final Season1 SPRING=new Season1("春天","暖");----->SPRING("春天","暖");
    //3:如果有多个常量,使用,号隔开即可
    //4:如果使用enum来实现枚举,要将定义常量对象,写在前面
    //5:如果使用无参构造器,括号()都可以省略

    SPRING("春天","暖"),SUMMER("夏天","热"),AUTUMN("秋天","凉"),WINTER("冬天","冷");
    private String name;
    private String desc;//描述

    //定义四个对象:
//    public static final Season1 SPRING=new Season1("春天","暖");
//    public static final Season1 SUMMER=new Season1("夏天","热");
//    public static final Season1 AUTUMN=new Season1("秋天","凉");
//    public static final Season1 WINTER=new Season1("冬天","冷");

    private Season2(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }

    public String getName() {
        return name;
    }

    public String getDesc() {
        return desc;
    }

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

 

Enum原理:

Java文件编译原理:

220fdd5449414925b056d3980becbef3.png

查看enum的反编译文件:

92710b4e40884eb4bf671faf07002588.png 

使用了enum关键字的枚举类都继承了java.lang.Enum类。

练习:

public class enumTest4 {
    public static void main(String[] args) {
        Gender boy1= Gender.BOY;
        Gender boy2=Gender.BOY;
        //本质上是调用父类Enum的toString方法,输出该对象的名字
        System.out.println(boy1);
        System.out.println(boy1==boy2);//boy1和boy2指向的同一个常量BOY的地址,所以相等输出True
    }
}

enum Gender{
    BOY,GIRL;
}

61c71d2fa357437e858bd0990d730a04.png

 

Enum常用方法:

c22543a9b41a4264a6adbbc462f3905d.png

3acbb594aecf4fc3990000f8f8666f86.png 

练习:

/*
* Enum类的各种方法:
* */
public class enumTest5 {
    public static void main(String[] args) {
        Season_test spring=Season_test.SPRING;
        //1:name()方法:输出枚举对象名字
        System.out.println(spring.name());
        //2:ordinal()方法:输出该枚举对象的次序(从0开始),SPRING是第一个枚举对象,所以输出0
        System.out.println(spring.ordinal());
        //3:反编译可以看见values方法,返回该枚举类的所有对象
        Season_test[] values=Season_test.values();
        for(Season_test season:values){//迭代输出
            System.out.println(season);
        }
        //4:valueOf()将字符串转化成枚举对象,要求字符串必须为已有的常量名,否则报异常
        Season_test spring_test = Season_test.valueOf("SPRING");
        System.out.println("spring_test:"+spring_test);
        System.out.println(spring==spring_test);//true
        //5:compareTo()比较两个,枚举常量,比较的就是两个枚举对象的编号return self.ordinal - other.ordinal;的差值
        System.out.println(spring.compareTo(spring_test));
        //6:toString()输出枚举对象的名字,可以重写该方法,来输出你想输出的东西
        System.out.println(spring);
    }
}

enum Season_test{
    SPRING("春天","暖"),SUMMER("夏天","热"),AUTUMN("秋天","凉"),WINTER("冬天","冷");
    private String name;
    private String desc;//描述

    private Season_test(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }

    public String getName() {
        return name;
    }

    public String getDesc() {
        return desc;
    }

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

练习:

创建一个Week枚举类,并输出。

public class enumTest6 {
    public static void main(String[] args) {
        Week[] weeks=Week.values();
        for (Week week : weeks) {
            System.out.println(week);
        }
    }
}

enum Week{
    MONDAY("星期一"),TUESDAY("星期二"),WEDNESDAY("星期三"),THURSDAY("星期四"),FRIDAY("星期五"),SATURDAY("星期六"),SUNDAY("星期天");

    private String name;

    Week(String name) {//默认为private
        this.name = name;
    }

    @Override
    public String toString() {
        return  name;
    }
}

 

注意

1:使用enum关键字后,就不能再继承其他的类了,因为enum会隐式的继承Enum,Java是单继承机制。

2:枚举类和普通类一样,可以实现接口,如下形式。

enum 类名 implements 接口1 ,接口2 {}

 

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 枚举是一种特殊的数据类型,它可以定义一组常量,这些常量在程序中是固定不变的。枚举常量可以用于代表一些特定的状态或类型,比如星期几、颜色、性别等。在Java中,枚举类型是通过关键字enum来定义的。枚举类型的常量可以通过枚举类型名和常量名来访问,例如:Weekday.MONDAY。枚举类型还可以定义方法和构造函数,以便更好地描述枚举常量的特性和行为。枚举类型在Java中广泛应用于各种场景,例如状态机、配置管理、错误码等。 ### 回答2: 枚举(Enumeration)在Java中是一种特殊的数据类型,它是一组有限且已命名的数据项的集合。枚举类型属于引用数据类型,它的每一个成员都是一个常量对象,且不能改变,可以看作一个常量的集合。 枚举类型的定义格式如下: enum 枚举类型名称{ 枚举值1, 枚举值2, …… 枚举值N; } 其中,枚举常量就是指定义在枚举类型中的数据项,每个枚举常量都有一个唯一的名称,并且是用常量大写字母来表示的。我们可以使用枚举类型定义变量,枚举类型变量赋值的时候只能取枚举类型中的某一个值,不能赋值其他类型的值。 枚举类型的最大优点就在于其具备范围固定、安全性高、易于理解的特点。在处理程序中,为了避免输入的数据不符合要求或程序出现异常,我们经常要用到对数据的限制。而对于枚举类型,系统会自动限定它的取值,程序员不需要额外考虑对值的判断,因此大大简化代码,提高程序的可读性、可维护性。 在Java程序的开发中,枚举类型经常被用在菜单项、操作类型、状态码等等的定义中。比如一个操作系统的文件操作类型就可以定义为枚举类型,包括新建、打开、复制、粘贴、剪切等操作,这样就方便了后续的程序设计。 总之,枚举类型在Java程序设计中已经被广泛应用,在一些常量的定义、一些有限值数据类型的定义上使用枚举类型能够方便代码的编写,提高程序的可读性并减少程序出错的可能。 ### 回答3: 枚举Java中一种特殊的类,它可以用来定义一组固定的值,枚举成员就是这组固定的值。例如,我们可以定义一个枚举类来表示一周中的每一天: ``` public enum DayOfWeek { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY; } ``` 在定义枚举类时,每个枚举成员都是一个对象,它们都是该枚举类的实例。枚举成员的值默认为它们在枚举类中的位置,可以通过枚举成员的ordinal()方法获取。 枚举类中可以定义成员变量、构造方法、普通方法和静态方法。枚举成员作为对象,可以调用枚举类中的成员方法。 枚举还可以用在switch语句中,例如: ``` DayOfWeek day = DayOfWeek.MONDAY; switch (day) { case MONDAY: System.out.println("Today is Monday."); break; case TUESDAY: System.out.println("Today is Tuesday."); break; case WEDNESDAY: System.out.println("Today is Wednesday."); break; case THURSDAY: System.out.println("Today is Thursday."); break; case FRIDAY: System.out.println("Today is Friday."); break; case SATURDAY: System.out.println("Today is Saturday."); break; case SUNDAY: System.out.println("Today is Sunday."); break; } ``` 以上代码输出的结果是“Today is Monday.”。 枚举的好处是使代码更容易理解和维护,因为它将具有相同含义的常量组织在一起,而且可以避免使用数字表示常量,增加代码的可读性。另外,枚举还可以提供类型安全检查,避免类型错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值