枚举类的两种定义方式及练习

枚举类的两种定义方式及练习

  • 大纲:
枚举类的使用
1.枚举类的理解:
    枚举类型本质上也是一种类,只不过是这个类的对象是有限的,固定的几个,不能让用户随意创建。

2.举例:
    - 星期:Monday(星期一)......Sunday(星期天)
    - 性别:Man()Woman(女)
    - 月份:January1月)......December(12)
    - 季节:Spring(春天)......Winter(冬天)
    - 三原色:red(红色)、green(绿色)、blue(蓝色)
    - 支付方式:Cash(现金)、WeChatPay(微信)Alipay(支付宝)BankCard(银行)CreditCard(信用卡)
    - 就职状态:Busy(忙碌)Free(空闲)Vocation(休假)Dimission(离职)
    - 订单状态:Nonpayment(未付款)、Paid(已付款)Fulfilled(已配货)、Delivered(已发货)Checked(已确认收货)Return(退货)Exchange(换货)Cancel(取消)
    - 线程状态:创建、就绪、运行、阻塞、死亡

3.开发中的建议:
    开发中,如果针对于某个类,其实例是确定个数的。则推荐将此类声明为枚举类。
    如果枚举类的实例只有一个,则可以看做是单例的实现方式。

4.JDK5.0之前如何自定义枚举类(了解)
见代码

5.JDK5.0中使用enum定义枚举类
见代码

6.Enum中的常用方法:
6.1 使用enum关键字定义的枚举类,默认其父类是java.lang.Enum类
    使用enum关键字定义的枚举类,不要显示的去定义其父类,否则报错。
6.2 熟悉Enum类中常用的方法
    String toString():默认返回的是常量名(对象名),可以继续手动重写该方法!
    (关注)static 枚举类型[] values():返回枚举类型的对象数组。该方法可以很方便的遍历所有的枚举值,是一个静态方法
    (关注)static 枚举类型 valueOf(String name):可以把一个字符串转为对应的枚举对象。要求字符串必须是枚举类对象的"名字"。如不是,会有运行时异常,IllegalArgumentExceptionString name():得到当前枚举常量的名称。建议优先使用toString()int ordinal():返回当前枚举常量的次序号,默认从0开始


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

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

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

    • 星期:Monday(星期一)…Sunday(星期天)
    • 性别:Man(男)、Woman(女)
    • 月份:January(1月)…December(12月)
    • 季节:Spring(春天)…Winter(冬天)
    • 三原色:red(红色)、green(绿色)、blue(蓝色)
    • 支付方式:Cash(现金)、WeChatPay(微信)、Alipay(支付宝)、BankCard(银行)、CreditCard(信用卡)
    • 就职状态:Busy(忙碌)、Free(空闲)、Vocation(休假)、Dimission(离职)
    • 订单状态:Nonpayment(未付款)、Paid(已付款)、Fulfilled(已配货)、Delivered(已发货)、Checked(已确认收货)、Return(退货)、Exchange(换货)、Cancel(取消)
    • 线程状态:创建、就绪、运行、阻塞、死亡
  • 若枚举只有一个对象,则可以作为一种单例模式的实现方式。

  • 枚举类的实现:

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

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

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

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

    package oop.demo14_enum;
    
    public class SeasonTest {
        public static void main(String[] args) {
            //Season.SPRING;
            System.out.println(Season.SPRING);
            System.out.println(Season.SUMMER);
            System.out.println(Season.AUTUMN);
            System.out.println(Season.WINTER);
            System.out.println(Season.WINTER.getSeasonName());
            System.out.println(Season.WINTER.getSeasonDesc());
        }
    
    }
    
    //jdk5.0之前定义枚举类的方式
    class Season{
    
        //2.声明当前类的对象的实例变量,需要使用private final修饰
        private final String seasonName;//seasonName季节的名称
        private final String seasonDesc;//seasonDese季节的描述
    
        //1.私有化类的构造器
        private Season(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修饰
        public static final Season SPRING = new Season("春天","春暖花开");
        public static final Season SUMMER = new Season("夏天","夏日炎炎");
        public static final Season AUTUMN = new Season("秋天","秋分瑟瑟");
        public static final Season WINTER = new Season("冬天","白雪皑皑");
    
        @Override
        public String toString() {
            return "Season{" +
                    "seasonName='" + seasonName + '\'' +
                    ", seasonDesc='" + seasonDesc + '\'' +
                    '}';
        }
    }
    

    输出:

    在这里插入图片描述

    • 在jdk5.0之后,java支持enum关键字来快速定义枚举类型。
public class SeasonTest1 {
    public static void main(String[] args) {
        System.out.println(Season1.SPRING.getClass());//输出class oop.demo14_enum.Season1 获取当前所属的类
        System.out.println(Season1.SPRING.getClass().getSuperclass());//输出class java.lang.Enum  获取当前所属的类的父类
        System.out.println(Season1.SPRING.getClass().getSuperclass().getSuperclass());//输出class java.lang.Object
    }

}

//jdk5.0中使用enum关键字定义枚举类
    enum Season1 {   //默认的父类Enum.java
    //1.必须在枚举类的开头声明多个对象。对象之间使用','隔开
    SPRING ("春天","春暖花开"),
    SUMMER ("夏天","夏日炎炎"),
    AUTUMN ("秋天","秋分瑟瑟"),
    WINTER ("冬天","白雪皑皑");

    //2.声明当前类的对象的实例变量,需要使用private final修饰
    private final String seasonName;//seasonName季节的名称
    private final String seasonDesc;//seasonDesc季节的描述

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

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

    public String getSeasonDesc() {
        return seasonDesc;
    }
        
}

输出:

在这里插入图片描述

  • Enum中的常用方法及枚举类实现接口:

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

package oop.demo14_enum;

public class SeasonTest1 {
    public static void main(String[] args) {
//        System.out.println(Season1.SPRING.getClass());//输出class oop.demo14_enum.Season1 获取当前所属的类
//        System.out.println(Season1.SPRING.getClass().getSuperclass());//输出class java.lang.Enum  获取当前所属的类的父类
//        System.out.println(Season1.SPRING.getClass().getSuperclass().getSuperclass());//输出class java.lang.Object

        //测试方法
        //1.toString()
        System.out.println(Season1.SPRING);//输出SPRING,也可以后面重写toString,输出的就是Season1{seasonName='春天', seasonDesc='春暖花开'}
        System.out.println(Season1.SUMMER);//输出SUMMER

        System.out.println("---------------------------");

        //2.name
        System.out.println(Season1.SPRING.name());//输出SPRING

        System.out.println("---------------------------");

        //3.values()
        Season1[] values = Season1.values();//Season1.values();然后Alt+Enter  其实就是把枚举类的所有对象都放在了前面的数组里面
        for (int i = 0; i < values.length; i++) {
            System.out.println(values[i]);
            /*
            输出:
            Season1{seasonName='春天', seasonDesc='春暖花开'}
            Season1{seasonName='夏天', seasonDesc='夏日炎炎'}
            Season1{seasonName='秋天', seasonDesc='秋分瑟瑟'}
            Season1{seasonName='冬天', seasonDesc='白雪皑皑'}
             */
        }

        System.out.println("---------------------------");

        //4.valueOf(String objName):返回当前枚举类中名称为objName的枚举类对象。
        //如果枚举类中不存在objName名称的对象,则报错。
        String objName = "WINTER";
            Season1 season1 = Season1.valueOf(objName);
            System.out.println(season1);//输出:Season1{seasonName='冬天', seasonDesc='白雪皑皑'}

        System.out.println("---------------------------");

        //5.ordinal()
        System.out.println(Season1.AUTUMN.ordinal());//输出2,像数组下标

        System.out.println("---------------------------");

        //通过枚举类的对象,调用重写接口中的方法
        Season1.SUMMER.show();//输出:这是一个季节
    }

}

interface Info{
    void show();
}

//jdk5.0中使用enum关键字定义枚举类
    enum Season1 implements Info{   //默认的父类Enum.java
    //1.必须在枚举类的开头声明多个对象。对象之间使用','隔开
    SPRING ("春天","春暖花开"),
    SUMMER ("夏天","夏日炎炎"),
    AUTUMN ("秋天","秋分瑟瑟"),
    WINTER ("冬天","白雪皑皑");

    //2.声明当前类的对象的实例变量,需要使用private final修饰
    private final String seasonName;//seasonName季节的名称
    private final String seasonDesc;//seasonDesc季节的描述

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

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

    public String getSeasonDesc() {
        return seasonDesc;
    }

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


    @Override
    public void show() {
        System.out.println("这是一个季节");
    }
}

输出:

在这里插入图片描述

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

package oop.demo14_enum;

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

interface Info1{
    void show();
}

//jdk5.0中使用enum关键字定义枚举类
enum Season2 implements Info1 {   //默认的父类Enum.java
    //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修饰
    private final String seasonName;//seasonName季节的名称
    private final String seasonDesc;//seasonDesc季节的描述

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

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

    public String getSeasonDesc() {
        return seasonDesc;
    }

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


}

输出:

在这里插入图片描述


练习1:

package oop.demo14_enum.exercises;

public class Employee {     //Employee:员工

    private String name;
    private int age;
    private Status status;

    //get,set方法
    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Status getStatus() {
        return status;
    }

    public void setStatus(Status status) {
        this.status = status;
    }

    //无参构造器
    public Employee() {
    }
    //有参构造器
    public Employee(String name, int age, Status status) {
        this.name = name;
        this.age = age;
        this.status = status;
    }

    //toString
    @Override
    public String toString() {
        return "Employee{" +
                "员工姓名是:'" + name + '\'' +
                ", 年龄是" + age +
                ", 状态是" + status +
                '}';
    }
}
package oop.demo14_enum.exercises;

//定义公司中员工的状态
public enum Status { //Status:状态

    Busy,Free,Vocation,Dimission;

}
package oop.demo14_enum.exercises;

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

输出:

在这里插入图片描述

练习2:

案例:使用枚举类实现单例模式

package oop.demo14_enum.exercises02;

public class BankTest1 {
    public static void main(String[] args) {
        //Bank1.instance = null;

        System.out.println(GirlFriend.小美);//输出:小美
    }
}

//jdk5.0之前使用枚举类定义单例模式
class Bank1{

    //私有的无参构造器
    private Bank1() {
    }
    public static final Bank1 instance = new Bank1();//instance:实例

    //不用方法调了,直接用类调用,所以就不用下面的方法了
//    public static Bank1 getInstance() {
//        return instance;
//    }

}

//jdk5.0使用enum关键字定义枚举类的方式定义单例模式
enum Bank2{
    PBC;//(中国人民银行)
}

enum GirlFriend{

    小美(18);

    private final int age;

    //私有有参构造
   private GirlFriend(int age) {
        this.age = age;
    }

}

练习3:

案例:颜色枚举类Color(使用enum声明)

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

2.在测试类中,使用枚举类,获取绿色对象,并打印对象。
package oop.demo14_enum.exercise03;

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

练习3拓展:

案例3拓展:颜色枚举类(使用enum声明)
(1)声明颜色枚举类Color;

- 声明final修饰的int类型的属性red,green,blue
- 声明final修饰的String类型的属性description
- 声明有参构造器Colorint red,int green,int blue,String description)
- 创建7个常量对象:红、橙、黄、绿、青、蓝、紫;
- 重写toString方法,例如:RED(255,0,0)-->红色

(2)在测试类中,使用枚举类,获取绿色对象,并打印对象。

提示:
- 7个常量对象的RGB值如下:
红:(255,0,0)
橙:(255,128,0)
黄:(255,255,0)
绿:(0,255,0)
青:(0,255,255)
蓝:(0,0,255)
紫:(128,0,255
package oop.demo14_enum.exercise04;

enum Color {
    RED(255,0,0, "红色"), //RGB值有红绿蓝组成,红:255,绿:0,蓝:0
    ORANGE(255,128,0,"橙色"),
    YELLOW(255,255,0,"黄色"),
    GREEN(0,255,0,"绿色"),
    CYAN(0,255,255,"青色"),
    BLUE(0,0,255,"蓝色"),
    PURPLE(128,0,255,"紫色");//没写对象他会一直有个分号';',就是让你写对象


     private final int red,green,blue;
     private final String description;//描述

    Color(int red, int green, int blue, String description) {
        this.red = red;
        this.green = green;
        this.blue = blue;
        this.description = description;
    }

    public int getRed() {
        return red;
    }

    public int getGreen() {
        return green;
    }

    public int getBlue() {
        return blue;
    }

    public String getDescription() {
        return description;
    }

    @Override
    public String toString() {
        return name() + "(" + red + "," + green + "," + blue + ")" + "-->" + description;//name()代表枚举enum对象名
    }
}
package oop.demo14_enum.exercise04;

public class ColorTest {
    public static void main(String[] args) {
        System.out.println(Color.GREEN);
    }
}

输出:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值