枚举类与注解 之 枚举类讲解-编程思维

枚举类与注解

参考网站:https://www.bilibili.com/video/BV1X741147h5?p=4

  • 枚举类和注解可以看做是jdk5.0出现的两个新特性。

枚举类的使用:入门

类的对象只有有限个,确定的。

举例子:

星期:星期一,星期二,,星期日。

季节:春、夏、秋、冬。

等等

  • 当需要定义一组常量的时候,强烈建议使用枚举类。

如果枚举类中只有一个对象,则可以作为单例模式的一种实现方式。

如何定义枚举类:

方式一:jdk5.0之前,自定义枚举类

方式二:jdk5.0时候,可以使用enum关键字定义枚举类。

方式一:jdk5.0之前,自定义枚举类 代码展示:

package com.enumstudy;

/**
 * 枚举类的使用和测试
 * 创建枚举类,使用jdk5.0之前的方式进行创建
 */
public class SessionTest {
    public static void main(String[] args) {
        Season autumn = Season.AUTUMN;
        System.out.println(autumn);
    }
}

/**
 * 自定义枚举类
 * 现在创建的就是枚举类
 */
class Season{
    //1.申明Session对象的属性:private final 修饰
    private final String seasonName;
    private final String seasonDesc;

    //2.私有化类的构造器,并且给对象属性赋值
    private Season(String seasonName, String seasonDesc) {
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }
    //3.提供当前枚举类的多个对象
    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("冬天","冬天是寒冷的");
    //4.其他诉求1:获取枚举类对象的属性
    public String getSeasonName() {
        return seasonName;
    }

    public String getSeasonDesc() {
        return seasonDesc;
    }
    //4.其他诉求2:添加头toString()
    @Override
    public String toString() {
        return "Season{" +
                "seasonName='" + seasonName + '\'' +
                ", seasonDesc='" + seasonDesc + '\'' +
                '}';
    }
}

方式二:使用enum关键字创建枚举类:

package com.enumstudy;

/**
 * 使用enum关键字的方式创建枚举类
 * 需要注意的是:定义的enum枚举类,继承于class java.lang.Enum
 */
public class SeasonTest1 {
    public static void main(String[] args) {
        Season1 autumn1 = Season1.AUTUMN;
        System.out.println(autumn1);//如果我们没有重写Enum类中的toString()。输出结果:AUTUMN 说明enum的父类不是Object,因为如果是Object的话,Object中的toString()方法打印出来的是对象的地址值。
        //重写了toString()的话,输出结果:Season{seasonName='秋天', seasonDesc='秋天是凉爽的'}
        System.out.println("enum类的父类是:"+Season1.class.getSuperclass());//如果我们没有重写Enum类中的toString()。enum类的父类是:class java.lang.Enum
        System.out.println("===============================================");
//        values()主要是用来罗列枚举类的状态
        Season1[] values = Season1.values();
        for (int i = 0; i < values.length; i++) {
            System.out.println(values[i]);
        }
        //运行结果:
        /**
         * Season{seasonName='春天', seasonDesc='春天是温暖的'}
         * Season{seasonName='夏天', seasonDesc='夏天是炎热的'}
         * Season{seasonName='秋天', seasonDesc='秋天是凉爽的'}
         * Season{seasonName='冬天', seasonDesc='冬天是寒冷的'}
         */
        //类似的我们还可以查看线程的状态
        System.out.println("===============================================");
        Thread.State[] states = Thread.State.values();
        for (int i = 0; i < states.length; i++) {
            System.out.println(states[i]);
        }
        System.out.println("===============================================");
        //valueOf(String objName) :返回枚举类中对象名称是objName的对象
        Season1 summer = Season1.valueOf("SUMMER");
        System.out.println(summer);
        //运行结果:Season{seasonName='夏天', seasonDesc='夏天是炎热的'}

    }
}
//使用enum关键字的方式定义枚举类
enum  Season1{
    //说白了就是在jdk5.0方式创建枚举类基础上进行简化,将相同的东西删除掉
    //1.提供当前枚举类的对象,多个对象之间用","隔开,末尾对象“;”结束
    SPRING("春天","春天是温暖的"),
    SUMMER("夏天","夏天是炎热的"),
    AUTUMN("秋天","秋天是凉爽的"),
    WINTER("冬天","冬天是寒冷的");

    //1.申明Season1对象的属性,使用private final来进行修饰
    private final String seasonName;
    private final String seasonDesc;

    //2.私有化类的构造器,并且给对象属性赋值
    private Season1(String seasonName, String seasonDesc) {
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }
    //4.其他诉求1:获取枚举类对象的属性
    public String getSeasonName() {
        return seasonName;
    }

    public String getSeasonDesc() {
        return seasonDesc;
    }

    //5.其他诉求2:添加头toString()
    @Override
    public String toString() {
        return "Season{" +
                "seasonName='" + seasonName + '\'' +
                ", seasonDesc='" + seasonDesc + '\'' +
                '}';
    }
}

class java.lang.Enum类中的toString():

    public String toString() {
        return name;
    }

枚举类enum实现接口情况

情况一:实现接口,在enum类中实现抽象方法

package com.enumstudy;

/**
 * 使用enum关键字的方式创建枚举类
 * 需要注意的是:定义的enum枚举类,继承于class java.lang.Enum
 */
public class SeasonTest1 {
    public static void main(String[] args) {
        Season1 autumn1 = Season1.AUTUMN;
        autumn1.show();//运行结果:这是一个季节
        Season1 autumn1 = Season1.SUMMER;
        autumn1.show();//运行结果:这是一个季节
        //由此我们可以看出,不论枚举类中的哪一个对象来使用,最终的运行结果都是一样的

    }
}

/**
 * 定义一个接口
 */
interface Info{
    void show();
}
//使用enum关键字的方式定义枚举类
enum  Season1 implements Info{
    //说白了就是在jdk5.0方式创建枚举类基础上进行简化,将相同的东西删除掉
    //1.提供当前枚举类的对象,多个对象之间用","隔开,末尾对象“;”结束
    SPRING("春天","春天是温暖的"),
    SUMMER("夏天","夏天是炎热的"),
    AUTUMN("秋天","秋天是凉爽的"),
    WINTER("冬天","冬天是寒冷的");

    //1.申明Season1对象的属性,使用private final来进行修饰
    private final String seasonName;
    private final String seasonDesc;

    //2.私有化类的构造器,并且给对象属性赋值
    private Season1(String seasonName, String seasonDesc) {
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }
    //4.其他诉求1:获取枚举类对象的属性
    public String getSeasonName() {
        return seasonName;
    }

    public String getSeasonDesc() {
        return seasonDesc;
    }

    //5.其他诉求2:添加头toString()
    @Override
    public String toString() {
        return "Season{" +
                "seasonName='" + seasonName + '\'' +
                ", seasonDesc='" + seasonDesc + '\'' +
                '}';
    }

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

情况二:枚举类实现接口,我们想要枚举类中的每个对象调用接口中的方法的时候,展示结果都不一样。

package com.enumstudy;

/**
 * 使用enum关键字的方式创建枚举类
 * 需要注意的是:定义的enum枚举类,继承于class java.lang.Enum
 */
public class SeasonTest1 {
    public static void main(String[] args) {
        Season1 autumn1 = Season1.AUTUMN;
        autumn1.show();
        Season1 summer1 = Season1.SUMMER;
        summer1.show();
       /**
       *运行结果:
          秋天是一个秋高气爽的季节
          夏天是一个热情似火的季节
       *
       */
    }
}

/**
 * 定义一个接口
 */
interface Info{
    void show();
}
//使用enum关键字的方式定义枚举类
enum  Season1 implements Info{
    //说白了就是在jdk5.0方式创建枚举类基础上进行简化,将相同的东西删除掉
    //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("冬天是一个冰天雪地的季节");
        }
    };

    //1.申明Season1对象的属性,使用private final来进行修饰
    private final String seasonName;
    private final String seasonDesc;

    //2.私有化类的构造器,并且给对象属性赋值
    private Season1(String seasonName, String seasonDesc) {
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }
    //4.其他诉求1:获取枚举类对象的属性
    public String getSeasonName() {
        return seasonName;
    }

    public String getSeasonDesc() {
        return seasonDesc;
    }

    //5.其他诉求2:添加头toString()
    @Override
    public String toString() {
        return "Season{" +
                "seasonName='" + seasonName + '\'' +
                ", seasonDesc='" + seasonDesc + '\'' +
                '}';
    }
}

版权声明:本文版权归作者所有,遵循 CC 4.0 BY-SA 许可协议, 转载请注明原文链接
https://www.cnblogs.com/dongyaotou/p/15727449.html