首页 > 其他分享 >枚举

枚举

时间:2023-05-13 14:04:13浏览次数:26  
标签:String Season enum 枚举 public name

1. 枚举介绍

1.1 要求创建季节(Season) 对象,请设计并完成。

class Season{//类 

private String name; 

private String desc;//描述 

//构造器 

//getXX 

//setXX 

}

普通方法 代码在com.stulzl.enum_common.包中   424

Enumeration01
package com.stulzl.enum_;

//枚举举例引入  424
//普通方法
public class Enumeration01 {
    public static void main(String[] args) {
        Season spring = new Season("春天", "温暖");
        Season winter = new Season("冬天", "寒冷");
        Season summer = new Season("夏天", "炎热");
        Season autumn = new Season("秋天", "凉爽");
        //因为对于季节而已,他的对象(具体值),是固定的四个,不会有更多
        //这样的设计类的思路,不能体现季节是固定
        //的四个对象,比如我还可以瞎写一个季节 Season other = new Season("红天", "~~~");
        //因此,这样的设计不好===> 枚举类[枚: 一个一个 举: 例举 , 即把具体的对象一个一个例举出来的类
        // 就称为枚举类]

    }
}
class Season{//类
    private String name;
    private String desc;//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;
    }
}

1.2 枚举方法  425

1.2.1 问题分析

创建 Season 对象有如下特点 

1) 季节的值是有限的几个值(spring, summer, autumn, winter) 

2) 只读,不需要修改。 

1.2.2 解决方案-枚举 

1) 枚举对应英文(enumeration, 简写 enum) 

2) 枚举是一组常量的集合。 

3) 可以这里理解:枚举属于一种特殊的类,里面只包含一组有限的特定的对象。 

1.2.3 枚举的二种实现方式 

1) 自定义类实现枚举 

2) 使用 enum 关键字实现枚举

1.2.4 自定义类实现枚举-应用案例

不需要提供setXxx方法,因为枚举对象值通常为只读

2.对枚举对象/属性使用final + static共同修饰,实现底层优化,可以防止类的加载

3.枚举对象名通常使用全部大写,常量的命名规范

4.枚举对象根据需要,也可以有多个属性

代码在com.stulzl.enum_enum01.包中

Enumeration02
package com.stulzl.enum_enum01;

//枚举举例 425
public class Enumeration02 {
    public static void main(String[] args) {
        System.out.println(Season.AUTUMN);
        System.out.println(Season.SPRING);
    }
}
//演示定义枚举实现
//1. 将构造器私有化,目的防止 直接 new
//2. 去掉 setXxx 方法, 防止属性被修改
//3. 在 Season 内部,直接创建固定的对象
//4. 优化,可以加入 final 修饰符,可以防止类的加载
class Season{//类
    private String name;
    private String desc;//desc是描述的意思

    //3. 在 Season 内部,直接创建固定的对象
    //定义了四个固定的对象,优化,可以加入 final 修饰符
    public static final Season SPRING = new Season("春天","温暖");
    public static final Season WINTER = new Season("冬天", "寒冷");
    public static final Season AUTUMN = new Season("秋天", "凉爽");
    public static final Season SUMMER = new Season("夏天", "炎热");

    //1. 将构造器私有化目的防止 直接 new
    private Season(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }

    //2. 去掉 setXxx 方法, 防止属性被修改

    public String getName() {
        return name;
    }

    public String getDesc() {
        return desc;
    }

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

1.2.5 小结:进行自定义类实现枚举,有如下特点

1) 构造器私有化 

2) 本类内部创建一组对象[四个 春夏秋冬] 

3) 对外暴露对象(通过为对象添加 public final static 修饰符) 

4) 可以提供 get 方法,但是不要提供 set

2. enum关键字实现枚举--快速入门  426

代码在com.stulzl.enum_enum02.

Enumeration03

package com.stulzl.enum_enum02;

// enum关键字实现枚举--快速入门  426
public class Enumeration03 {
    public static void main(String[] args) {
        System.out.println(Season.AUTUMN);
        System.out.println(Season.SPRING);
    }
}

//演示使用 enum 关键字来实现枚举类
//如果使用了 enum 来实现枚举类
//1. 使用关键字 enum 替代 class
//2. public static final Season SPRING = new Season("春天", "温暖") 直
//   接使用SPRING("春天", "温暖")替代 解读格式 常量名(实参列表)
//3. 如果有多个常量对象,使用 ,号间隔即可
//4. 如果使用 enum 来实现枚举,要求将定义常量对象,写在前面
//5. 如果我们使用的是无参构造器,创建常量对象,则可以省略 ()
enum Season{ //enum关键字枚举

    SPRING("春天","温暖"),WINTER("冬天", "寒冷"),AUTUMN("秋天", "凉爽"),SUMMER("夏天", "炎热");

    private String name;
    private String desc;//desc是描述的意思

    private Season(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{" +
                "name='" + name + '\'' +
                ", desc='" + desc + '\'' +
                '}';
    }
}

3. enum 关键字实现枚举注意事项  427

1) 当我们使用 enum 关键字开发一个枚举类时,默认会继承 Enum 类, 而且是一个 final 类[如何证明],使用 javap 工 具来演示 

2) 传统的 public static final Season2 SPRING = new Season2("春天", "温暖"); 简化成SPRING("春天", "温暖"), 这里必 须知道,它调用的是哪个构造器. 

3) 如果使用无参构造器 创建 枚举对象,则实参列表和小括号都可以省略 

4) 当有多个枚举对象时,使用,间隔,最后有一个分号结尾 

5) 枚举对象必须放在枚举类的行首.

4. 枚举练习

4.1 下面代码是否正确, 并说明表示的含义?   428

enum Gender{ //1min 

BOY , GIRL; 

//这里其实就是调用 Gender 类的无参构造器 

1) 上面语法是 ok 

2) 有一个枚举类 Gender, 没有属性。 

3) 有两个枚举对象 BOY, GIRL, 使用的无参构造器创建.

4.2  判断输出  428

枚举_枚举类

代码在com.stulzl.enum_exercise01.包中

Enum_Exercise01
package com.stulzl.enum_exercise01;

//枚举练习428
public class Enum_Exercise01 {
    public static void main(String[] args) {
        Gender2 boy = Gender2.BOY;//OK
        Gender2 boy2 = Gender2.BOY;//OK
        System.out.println(boy);//输出BOY //本质就是调用Gender2的父类Enum的toString()

        //父类Enum的toString()方法如下写法
//        public String toString() {
//            return name;
//        }
            System.out.println(boy2==boy); //True
    }
}

enum Gender2 {//父类Enum toString
BOY , GIRL;//这里就是调用默认无参构造器
}

5. enum常用方法说明  429

说明:使用关键字 enum 时,会隐式继承 Enum 类, 这样我们就可以使用 Enum 类相关的方法

1) toString:Enum 类已经重写过了,返回的是当前对象 名,子类可以重写该方法,用于返回对象的属性信息 

2) name:返回当前对象名(常量名),子类中不能重写 

3) ordinal:返回当前对象的位置号,默认从 0 开始 

4) values:返回当前枚举类中所有的常量 

5) valueOf:将字符串转换成枚举对象,要求字符串必须 为已有的常量名,否则报异常! 

6) compareTo:比较两个枚举常量,比较的就是编号!

代码在com.stulzl.enum_method.包中

Enum_Method 

package com.stulzl.enum_method;

//enum常用的方法 429
public class Enum_Method {
    public static void main(String[] args) {
        //使用 Season2 枚举类,来演示各种方法
        Season2 autumn = Season2.AUTUMN;//这里将AUTUMN枚举对象赋给了autumn

        // name:返回当前对象名(常量名),输出枚举对象的名字
        System.out.println(autumn.name());//这里将AUTUMN枚举对象名字给了enum父类的方法

        //ordinal() 输出的是该枚举对象的次序/编号,从 0 开始编号
        //AUTUMN 枚举对象是第三个,因此输出 2
        System.out.println(autumn.ordinal());//2

        // values:返回当前枚举类中所有的常量,从反编译可以看出 values 方法,返回 Season2[]数组
        //含有定义的所有枚举对象
        Season2[] values = Season2.values();
        //增强for循环
        System.out.println("=====遍历取出枚举对象=====");
        for(Season2 season:values){
            System.out.println(season);
        }

        /*//普通for循环
        int num[] = {1,2,9};
        System.out.println("=====普通for循环========");
        for (int i = 0; i 
            System.out.println(num[i]);
        }
        System.out.println("=====增强for循环========");
        //执行流程是依次从num数组中取出数据,赋给i,如果去除完毕,则退出for循环
        for(int i:num){
            System.out.println("i="+i);
        }*/

        //valueOf:将字符串转换成枚举对象,要求字符串必须 为已有的常量名,否则报异常!
        //执行流程
        //1. 根据你输入的 "AUTUMN" 到 Season2 的枚举对象去查找
        //2. 如果找到了,就返回,如果没有找到,就报错
        Season2 autumn1 = Season2.valueOf("AUTUMN");
        System.out.println("autumn1="+autumn1);
        System.out.println(autumn==autumn1);//T//证明他俩是一个对象

        // compareTo:比较两个枚举常量,比较的就是编号!
        //解读
        //1. 就是把 Season2.AUTUMN 枚举对象的编号 和 Season2.SUMMER 枚举对象的编号比较
        System.out.println(Season2.AUTUMN.compareTo(Season2.SUMMER));
    }
}
enum Season2{ //enum关键字枚举

    SPRING("春天","温暖"),WINTER("冬天", "寒冷"),AUTUMN("秋天", "凉爽"),SUMMER("夏天", "炎热");

    private String name;
    private String desc;//desc是描述的意思

    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 "Season{" +
                "name='" + name + '\'' +
                ", desc='" + desc + '\'' +
                '}';
    }
}

5. 练习  430

声明 Week 枚举类,其中包含星期一至星期日的定义; MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY; 

使用 values 返回所有的枚举数组, 并遍历 , 输出星期一,星期二……星期日

代码在com.stulzl.enum_exercise02.包中

Enum_Exercise02

package com.stulzl.enum_exercise02;

//练习  430
//声明 Week 枚举类,其中包含星期一至星期日的定义;
// MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
//使用 values 返回所有的枚举数组, 并遍历 , 输出星期一,星期二……星期日
public class Enum_Exercise02 {
    public static void main(String[] args) {
        Week values[] = Week.values();
        //遍历数组,增强for循环
        System.out.println("===所有星期的信息如下===");
        for(Week week:values){
            //System.out.println(week.getName());//输出方式1
            System.out.println(week);//输出方式2
        }
    }
}
enum Week{
    MONDAY("星期一"),TUESDAY("星期二"),WEDNESDAY("星期三"),THURSDAY("星期四"),FRIDAY("星期五"),
    SATURDAY("星期六"),SUNDAY("星期日");
    private String name;

    private Week(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

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

6. enum实现接口  431

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

2) 枚举类和普通类一样,可以实现接口,如下形式。 enum 类名 implements 接口 1,接口 2{}

代码在com.stulzl.enum_interface01.包中

Enum_Interface01

package com.stulzl.enum_interface01;

//枚举接口的举例431
public class Enum_Interface01 {
    public static void main(String[] args) {
        Music.CLASSMUSIC.playing();//调用
    }
}
class A{

}

//使用 enum 关键字后,就不能再继承其它类了,因为 enum 会隐式继承 Enum,而 Java 是单继承机制。
//enum Season3 extends A{
//
//}

//enum 实现的枚举类,仍然是一个类,所以还是可以实现接口的.
interface  IPlaying{//接口
    public void playing();
}
enum Music implements IPlaying{
    CLASSMUSIC;//枚举常量
    @Override
    public void playing() {
        System.out.println("播放音乐……");
    }
}

标签:String,Season,enum,枚举,public,name
From: https://blog.51cto.com/u_15784725/6273681

相关文章

  • 枚举类与注解
    枚举类的使用类的对象只有有限个,确定的。当需要定义一组常量时,强烈建议使用枚举类。如果枚举类只有一个对象,则可以作为单例模式的实现方式。如何定义枚举类:1.方式一:jdk5.0之前,自定义枚举类//自定义枚举类classSeason{ //1.声明Season对象的属性 privatefinalStringseas......
  • delphi 遍历枚举、获取枚举值的名称
    遍历枚举、获取枚举值的名称代码遍历枚举usesSystem.TypInfo;procedureTForm1.Button1Click(Sender:TObject);varI:TAlign;beginforI:=Low(TAlign)toHigh(TAlign)dobeginMemo1.Lines.Add('名称'+GetEnumName(TypeInfo(TAlign),Ord(I))+'值......
  • 单例模型中懒汉模型,饿汉模型,枚举与日志等级
    1.单例模型将构造器私有化,控制创建对象的个数懒汉模型时间换空间符合单线程多线程不可以synchronized同步锁使单例可以一直用但效率不行单例模型一般使用在一台机器Asynchronized异步锁饿汉模型空间换时间可以解决安全利用JVM利用static只初始化一次......
  • C#基础10 有关字符串,枚举内容
    字符串      重点掌握字符串特点 错误提示    -----Length:显示长度    ------Equals():比较两个属性是否内容相等  ----- Contains()|Replace():判断给定的字符是否出现过,如果有就用replace替代字符------Trim()|TrimStart()|TrimEends():去空......
  • SpringBoot中策略模式+工厂模式业务实例(接口传参-枚举类查询策略映射关系-执行不同策
    场景设计模式-策略模式在Java中的使用示例:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/127622238上面讲了策略模式在Java中的使用示例。下面看一个在SpringBoot中的实际使用示例。业务场景:有多个煤矿,信号灯有多个厂家/规则,每个煤矿对应一种信号灯。需要编......
  • java定义枚举并赋值_java中枚举的特性是什么?如何赋值?
    java定义枚举并赋值_java中枚举的特性是什么?如何赋值?原文链接:https://blog.csdn.net/weixin_32821643/article/details/114441841上次已经为大家介绍过java枚举的概念是什么的主要内容了。今天再来为大家介绍一些相关的知识,也是关于java枚举的一些内容,也就是它的特性以及如何......
  • 递归实现三类枚举
    ​1.递归实现组合类枚举组合类枚举:从n中选s个数的所有组合n=0m=0defdfs(u:int,s:int,state:int):ifs==m:foriinrange(0,n):ifstate>>i&1:print(i+1,end='')print(""......
  • 第10章 枚举类和注解
    1.枚举类的使用枚举类的实现:在JDK1.5之前需要自定义枚举类在JDK1.5之后新增了enum关键字用于定义枚举类枚举类的属性:枚举类对象的属性不应允许被改动,所以应该使用privatefinal进行修饰。(若枚举只有一个对象,则可以作为一种单例模式的实现方式,即privatefinal类名instance=......
  • go 枚举
    前言枚举类型是一种常用的数据类型,用于表示一组有限的、预定义的、具名的常量值。在枚举类型中,每个常量都是一个枚举值,它们之间的值相等且唯一。枚举类型通常用于表示一组相关的常量,比如星期、月份、性别等等。在其他语言里(比如 Java 和 C),都内置了枚举类型,而在 Go 语言里是......
  • Java-Day-14( 枚举 + 注解 + 自设头文件 )
    Java-Day-14枚举(enumeration,enum)若是创建春夏秋冬四季的信息,如果按传统方法创建,无法固定信息,可以随时调改,所以要用枚举,做到只读且不能改枚举一组常量的集合——属于一种特殊的类,里面只包含一组有限的特定的对象实现方式自定义类实现枚举构造器私有化......