Java-第一章 枚举的用法详解及练习

发布时间:2024年01月21日

目录

🐶1.1 枚举概述

🐶1.2 枚举的定义

1. 🥙5.0之前枚举类的实现

2. 🥙使用enum关键字

🐶1.3 Enum的常用方法

1. 🥙toString()

2. 🥙values()

3. 🥙valueOf(name)

4. 🥙ordinal()

🐶1.4 枚举类实现接口的操作

🐶1.5 枚举类的练习


🐶1.1 枚举概述

  • 枚举类型本质上也是一种类,只不过是这个类的对象是有限的、固定的几个,不能让用户随意创建。

  • 枚举类的例子举不胜举:

    • 星期:Monday(星期一)...Sunday(星期天)

    • 性别: Man(男)、Woman(女)

    • 月份: January(1月)...December(12月)

    • 季节:Spring(春节)...Winter(冬天)

    • 三原色: red(红色)、green(绿色)、blue(蓝色)

  • 若枚举只有一个对象,则可以作为一种单例模式的实现方式

  • 枚举类的实现:

    开发中的建议:

    开发中,如果针对某个类,其实例是确定个数的,则推荐将此类声明为枚举类。

    • 在jdk5.0之前,需要程序员自定义枚举类型。

    • 在jdk5.0之后,Java支持enum关键字来快速定义枚举类型

🐶1.2 枚举的定义

1. 🥙5.0之前枚举类的实现

在JDK5.0之前如何声明枚举类呢?

  • 私有化类的构造器,保证不能在类的外部创建其对象。

  • 在类的内部创建枚举类的实例。声明为:public static final,对外暴露这些常量对象

  • 对象如果有实例变量,应该声明为private final(建议,不是必须),并在构造器中初始化。

代码:

package com.maven.pojo;

public class Season {
    public static void main(String[] args) {
        System.out.println(SeasonInstance.spring);
        System.out.println(SeasonInstance.summer.getSeasonName());
        System.out.println(SeasonInstance.summer.getSeasonDesc());
    }
}

//jdk5.0之前定义枚举类的方式
class SeasonInstance{

    //2. 声明当前类的对象的实例变量
    //声明当前类的对象的实例变量
    private final String seasonName;//季节的名称
    private final String seasonDesc;//季节的描述

    //1. 私有化类的构造器
    private SeasonInstance(String seasonName, String seasonDesc){
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }

    //3. 提供实例变量的get方法
    public String getSeasonName() {
        return seasonName;
    }

    public String getSeasonDesc() {
        return seasonDesc;
    }

    //4. 创建当前类的实例
    public static final SeasonInstance spring=new SeasonInstance("春天","春暖花开");
    public static final SeasonInstance summer=new SeasonInstance("夏天","夏日炎炎");
    public static final SeasonInstance autumn=new SeasonInstance("秋天","秋高气爽");
    public static final SeasonInstance winter=new SeasonInstance("冬天","白雪皑皑");

    @Override
    public String toString() {
        return "SeasonInstance{" +
                "seasonName='" + seasonName + '\'' +
                ", seasonDesc='" + seasonDesc + '\'' +
                '}';
    }
}

结果:

2. 🥙使用enum关键字

  • 格式:public enmu 枚举名{}

  • 枚举常量定义:

    • 枚举中的常量名字大写,多个常量之间逗号分开,最后一个常量可以写分号,也可以不写。每一个常量,都表示这个类的对象。修饰符为public static final

    • 枚举中有默认的无参数的private修饰的构造方法,如果手写构造方法,也必须是私有修饰的。而且构造方法必须写在常量的后面,这时最后一个常量就必须要写分号。

public enum  Color {
    //枚举的静态常量
    RED,GREEN,YELLOW
}
  • 枚举的使用

由于枚举的常量为静态修饰可以直接枚举名.调用

public static void main(String[] args){
    MyEnum myEnum = MyEnum.GREEN;
    System.out.println(myEnum);
    System.out.println(myEnum.getName());
}

代码:

package com.maven.pojo;

public class SeasonTest1 {
    public static void main(String[] args) {
        System.out.println(Season1.spring);
        System.out.println(Season1.summer.getSeasonName());
        System.out.println(Season1.summer.getSeasonDesc());
    }
}

enum Season1{

    //1. 必须在枚举类的开头声明多个对象,对象之间使用,隔开
    spring("春天","春暖花开"),
    summer("夏天","夏日炎炎"),
    autumn("秋天","秋高气爽"),
    winter("冬天","白雪皑皑");

    //2. 声明当前类的对象的实例变量
    //声明当前类的对象的实例变量
    private final String seasonName;//季节的名称
    private final String seasonDesc;//季节的描述

    //1. 私有化类的构造器
    private Season1(String seasonName, String seasonDesc){
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }

    //3. 提供实例变量的get方法
    public String getSeasonName() {
        return seasonName;
    }

    public String getSeasonDesc() {
        return seasonDesc;
    }



    @Override
    public String toString() {
        return "SeasonInstance{" +
                "seasonName='" + seasonName + '\'' +
                ", seasonDesc='" + seasonDesc + '\'' +
                '}';
    }
}

结果:

🐶1.3 Enum的常用方法

使用enum关键字定义的枚举类,默认其父类是java.lang.Enum类。

使用enum关键字定义的枚举类,不要再显示的定义其父类。否则报错。

1. 🥙toString()

String toString():默认返回的是常量名(对象名),可以继续手动重写该方法。

2. 🥙values()

values():把我们的枚举类型转换成数组

public class test_day0119 {
    public static void main(String[] args) {
        //将枚举类型转换成数据
        season[] arr1=season.values();
        //利用foreach循环进行打印
        for(season item:arr1){
            System.out.println(item);
        }
    }
}

enum season{
    SPRING,SUMMER,AUTUMN,WINTER
}

?结果

3. 🥙valueOf(name)

valueOf():将一个字符串变成我们的枚举类型,若我们原本的枚举类型里不包含该字符串转换后的枚举值,那么系统会报错提示。

4. 🥙ordinal()

ordinal():获得当前枚举类型的下标

public class test_day0119 {
    public static void main(String[] args) {
        //将枚举类型转换成数据
        season[] arr1=season.values();
        //利用foreach循环进行打印
        for(season item:arr1){
            int index=item.ordinal();
            System.out.println(item+"index为:"+index);
        }
    }
}

enum season{
    SPRING,SUMMER,AUTUMN,WINTER
}

?

🐶1.4 枚举类实现接口的操作

1. 情况1:枚举类实现接口,在枚举类中重写接口中的抽象方法。当通过不同的枚举类对象调用此方法时,执行的是同一个方法。

2. 情况2:让枚举类的每一个对象重写接口中的抽象方法。当通过不同的枚举类对象调用此方法时,执行的是不同的实现方法。

package com.maven.pojo;

public class SeasonTest1 {
    public static void main(String[] args) {
        Season1[] values = Season1.values();
        for (int i = 0; i < values.length; i++) {
            values[i].show();
            values[i].show1();
        }

    }
}

interface Info1{
    void show();
    void show1();
}

enum Season1 implements Info1{

    //1. 必须在枚举类的开头声明多个对象,对象之间使用,隔开
    spring("春天","春暖花开"){
        @Override
        public void show() {
            System.out.println("春天在哪里");
        }

    },
    summer("夏天","夏日炎炎"){
        @Override
        public void show() {
            System.out.println("宁静的夏天");
        }
    },
    autumn("秋天","秋高气爽"){
        @Override
        public void show() {
            System.out.println("秋意浓");
        }
    },
    winter("冬天","白雪皑皑"){
        @Override
        public void show() {
            System.out.println("大约在冬季");
        }
    };

    //2. 声明当前类的对象的实例变量
    //声明当前类的对象的实例变量
    private final String seasonName;//季节的名称
    private final String seasonDesc;//季节的描述

    //1. 私有化类的构造器
    private Season1(String seasonName, String seasonDesc){
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }

    //3. 提供实例变量的get方法
    public String getSeasonName() {
        return seasonName;
    }

    public String getSeasonDesc() {
        return seasonDesc;
    }



    @Override
    public String toString() {
        return "SeasonInstance{" +
                "seasonName='" + seasonName + '\'' +
                ", seasonDesc='" + seasonDesc + '\'' +
                '}';
    }

    @Override
    public void show1() {
        System.out.println("四季的变化");
    }
}

结果:

🐶1.5 枚举类的练习

1. 🥙练习1:定义公司中员工的就职状态:Busy(忙碌)\Free(空闲)\Vocation(休假)、Dimission(离职)

员工类

import lombok.*;

@NoArgsConstructor
@AllArgsConstructor
@ToString
@Getter
@Setter
public class Employee {
    private String name;
    private int age;
    private Status status;
}

?员工状态类:

//就职状态:Busy(忙碌)\Free(空闲)\Vocation(休假)、Dimission(离职)
public enum Status {
    Busy,Free,Vocation,Dimission
}

测试类:

public class EmployeeTest {
    public static void main(String[] args) {
        Employee e1 = new Employee("Tom", 21, Status.Busy);
        System.out.println(e1);
    }
}

结果:

2. 🥙声明颜色枚举类:7个常量对象:RED,ORANGE,YELLOW,GREEN,CYAN,BLUE

public enum Color {
    RED,ORANGE,YELLOW,GREEN,CYAN,BLUE
}

文章来源:https://blog.csdn.net/weixin_40968325/article/details/135735755
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。