Java枚举(enum)学习笔记

1、什么是枚举

在java开发中,有时候一个类的对象是有限而且固定的,比如我们常见的季节类,就是春夏秋冬。只有这四个简单的对象而已,这些实例有限而且固定的类,在java中,被称为枚举类。
在java中,类的对象是有限个,确定的。这个类我们定义为枚举类。
举例:
星期:一二三四五六日
性别:男女

2、在JDK1.5之后提供了使用enum关键字来创建枚举类

a.自定义枚举类:


public class Season {
    //属性
    private final String seasonName;//季节名称
    private final String seasonDesc;//季节描述

    //利用构造器对属性进行赋值操作:
    private Season(String seasonName,String seasonDesc){
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }

    //提供枚举类的有限的确定的对象:
    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("冬天","冰天雪地");

    //额外的因数:

    public String getSeasonName() {
        return seasonName;
    }

    public String getSeasonDesc() {
        return seasonDesc;
    }

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

测试类

public class TestSeason {
    public static void main(String[] args) {
        Season summer = Season.SUMMER;
        System.out.println(summer);
        System.out.println(summer.getSeasonName());
    }

}

运行结果:

b.使用enum关键字创建枚举类

public enum Season {

    //提供枚举类的有限的确定的对象:
    SPRING("春天","春暖花开"),
    SUMMER("夏天","夏日炎炎"),
    AUTUMN("秋天","硕果累累"),
    WINTER("冬天","冰天雪地");

    private final String seasonName;//季节名称
    private final String seasonDesc;//季节描述

    //利用构造器对属性进行赋值操作:
    private Season(String seasonName, String seasonDesc){
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }


    //额外的因数:

    public String getSeasonName() {
        return seasonName;
    }

    public String getSeasonDesc() {
        return seasonDesc;
    }

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

测试类:

public class TestSeason {
    public static void main(String[] args) {
        Season winter = Season.WINTER;
        System.out.println(winter);

        //enum关键字对应的枚举类的上层父类是:java.lang.Enum
        //但是我们自定义的枚举类上层父类:Object
        System.out.println(Season.class.getSuperclass().getName());
    }
}

c.创建无属性的枚举类以及枚举类的常见方法

  • 用ENUM关键字创建的Season枚举类上面的父类是java.lang.Enum
  • 常用方法有以下几种:
    • toString() 获取对象的名字
    • values() 返回枚举类对象的数组
    • valueof() 通过对象名字获取枚举对象

无属性枚举类:

public enum Season {
    SPRING,
    SUMMER,
    AUTUMN,
    WINTER;
}

测试类及常用方法:

public class TestSeason {
    public static void main(String[] args) {
        //用ENUM关键字创建的Season枚举类上面的父类是java.lang.Enum,.
        //常用方法自定义的Season可以直接拿过来使用
        //toString(); 获取对象的名字
        Season autumn = Season.AUTUMN;
        System.out.println("=========toString()================");
        System.out.println(autumn.toString());

        System.out.println("==========values()===============");
        //values : 返回枚举类对象的数组
        Season[] values = Season.values();
        for (Season value : values) {
            System.out.println(value);
        }

        System.out.println("==========valueOf()===============");
        //valueof() 通过对象名字获取枚举对象
        Season autumn1 = Season.valueOf("AUTUMN");
        System.out.println(autumn1);

    }
}

d.枚举类实现接口以及通用方法和不同对象定制方法

  • 如果接口中的方法对于枚举类中的每一个枚举对象都相同,就是方法是通用的,那么可以直接写到枚举类内部。这时候,每一个枚举类对象调用方法都是相同的。
  • 也可以在枚举类中给每一个对象实现定制的方法,每个类都实现一次需要实现的接口方法,这样在方法调用的时候,每个对象调用的就是自己实现的接口方法

接口类:

public interface TestInterface {
    void show();
    void print();
}

枚举类:

public enum Season implements TestInterface{

    /**1、如果该接口对于枚举类中的每一个枚举对象都相同,就是方法是通用的,那么可以直接写到枚举类内部。这时候,每一个枚举类对象调用show都会输出同一句话
     *2、枚举类可以让每一个对象实现定制的方法,每个类都实现一次需要实现的接口,这样在方法调用的时候,每个对象调用的就是自己实现的接口
     */
    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("这是冬天");
        }
    };

    //如果该接口对于枚举类中的每一个枚举对象,
    // 都相同,就是方法是通用的,那么可以直接写到枚举类内部。
    // 如下代码,这时候,每一个枚举类对象调用show都会输出同一句话

    @Override
    public void print() {
        System.out.println("这是print...");
    }
}

测试类:

public class Test {
    public static void main(String[] args) {


/**1、如果该接口对于枚举类中的每一个枚举对象都相同,就是方法是通用的,那么可以直接写到枚举类内部。这时候,每一个枚举类对象调用show都会输出同一句话
 *2、但是枚举类可以让每一个对象实现定制的方法,每个类都实现一次需要实现的接口,这样在方法调用的时候,每个对象调用的就是自己实现的接口
 */
        Season autumn = Season.AUTUMN;
        autumn.show();
        autumn.print();

        Season summer = Season.SUMMER;
        summer.show();
        summer.print();
    }
}

e.枚举类的应用场景

  • 可以简化给对象赋值时校验是否符合规范,如下列中的sex属性,限定只能设置枚举中的值。
  • 作为switch的入参

枚举类:

public enum Gender {
    男,
    女;
}

Person类

public class Person {
    //属性:
    private int age;
    private String name;
    //private String sex;
    private Gender sex;

    public Gender getSex() {
        return sex;
    }

    public void setSex(Gender sex) {
        this.sex = sex;
    }

    public Person() {
    }

    public int getAge() {
        return age;
    }

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

    public String getName() {
        return name;
    }

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

//    public String getSex() {
//        return sex;
//    }
//
//    public void setSex(String sex) {
//        this.sex = sex;
//    }



    @Override
    public String toString() {
        return "Person{" +
                "age=" + age +
                ", name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                '}';
    }
}

测试类一、在给对象属性赋值时做为限定条件

public class Test {
    public static void main(String[] args) {
        Person p = new Person();
        p.setAge(19);
        p.setName("qingjiang");
        p.setSex(Gender.男);
        System.out.println(p);

        System.out.println(p.getSex());
    }
}

测试类二、枚举在Switch中的应用

public class Test02 {
    public static void main(String[] args) {
        Gender sex = Gender.男;
//  Switch可以接受枚举类型
//        Switch可传入类型:int short byte char String 枚举
        switch (sex){
            case 男:
                System.out.println("boy");
                break;
            case 女:
                System.out.println("girl");
                break;
        }
    }
}
posted @ 2021-04-28 23:31  雪漠阳光  阅读(174)  评论(0编辑  收藏  举报