Java 枚举enum类

Java枚举(Enum)

枚举

定义:

  • Java枚举是一种特殊的类,用来表示一组固定的常量。

  • 被enum关键字修饰的类型就是枚举类型

    (如果枚举不添加任何方法,枚举值默认为从0开始的有序数据。

比如定义一个枚举类表示季节,那里面有春、夏、秋和冬四个变量。

一个枚举类表示星期,那里面有星期一、星期二、星期三、星期四、星期五、星期六和星期日七个变量

枚举类表示月份就同理有十二个月、十二个变量。

  • 格式:

    • Java 枚举类使用 enum 关键字来定义,enum关键字的作用就像是classinterface
    • 各个常量使用逗号 , 来分割。注意最后一个枚举对象要使用“;”结尾,说明枚举值结束使用。
  • 1 枚举的本质:其实就是终止类,并继承Enum抽象类。

    2 枚举中的变量,其实就是一个当前类型的静态常量。

  • 枚举类型本质上是java.lang.Enum类的子类,(java.lang.Enum是一个抽象类)但Java中不支持多继承,因此枚举类型不能再继承其他类。

//测试类
public enum Season {       //上文说的季节类//每个成员变量都默认被 public final static修饰SPRING, SUMMER, AUTUMN, WINTER;
}
//测试类
public class SeasonTest {public static void main(String[] args) {for (Season seasonEnum : Season.values()) {System.out.println(seasonEnum+",ordinal:"+seasonEnum.ordinal()+",name:"+seasonEnum.name());}}
}
  • 每个被枚举的成员其实就是定义的枚举类型的一个实例,它们都被默认为final。无法改变常数名称所设定的值,它们也是public和static的成员,这与接口中的常量限制相同。可以通过类名称直接使用它们。

枚举中的方法

  • values() :返回enum实例的数组,而且该数组中的元素严格保持在enum中的声明时的顺序。

  • name():返回实例名。

  • ordinal():返回实例声明时的次序,从0开始

  • getDeclaringClass():返回实例所属的enum类型。

  • equals():判断是否为同一个对象

    也可以使用"=="来比较enum实例

  • valueOf():返回指定字符串值的枚举常量。

特性

  1. 除了不能继承,可以将enum看作一个普通类。
  2. Java不允许使用=为枚举常量赋值。
  3. enum通过方法来显式赋值
  4. enum可以添加普通方法、静态方法、抽象方法、构造方法。
  5. 枚举可以实现接口
  6. 枚举不可以继承

枚举类中定义抽象方法

既然编译器最终将每个枚举值声明为枚举类的实例,那我们能在枚举类中声明抽象方法让枚举值去实现么?

在枚举类Season中声明了一个抽象方法sayHello()。然后在创建枚举值时,就必须实现该抽象方法

public enum SeasonEnum {//枚举类的实例对象必须在最前面先定义,而且必须每个实例对象都必须维护上chinese成员变量SPRING("春天",1201){@Overridevoid sayHello() {System.out.println("hello spring");}},SUMMER("夏天",1202){@Overridevoid sayHello() {System.out.println("hello summer");}},AUTUMN("秋天",1203){@Overridevoid sayHello() {System.out.println("hello autumn");}},WINTER("冬天",1204){@Overridevoid sayHello() {System.out.println("hello winter");}};private String name;private Integer code;//枚举类型的构造函数默认为private,因为枚举类型的初始化要在当前枚举类中完成。SeasonEnum (String name,Integer code){this.name=name;this.code=code;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}abstract void sayHello();
}

测试类:

public class SeasonTest {public static void main(String[] args) {//直接初始化SeasonEnum season1 = SeasonEnum.SPRING;//调用SeasonEnum枚举类的sayHello方法season1.sayHello();}
}

控制台输出:

hello spring
  1. 枚举允许继承类吗?

    枚举类使用enum定义后在编译后默认继承了java.lang.Enum类,而不是普通的继承Object类。enum声明类继承了Serializable和Comparable两个接口。且采用enum声明后,该类会被编译器加上final声明(同String),故该类是无法继承的。

    所有枚举类都默认是Enum类的子类,无需我们使用extends来继承。

    1. 枚举允许实现接口吗?

    枚举允许实现接口。因为枚举本身就是一个类,类是可以实现多个接口的。

    public interface EnumInterface {public abstract void print();
    }
    public enum SizeEnum implements EnumInterface{BIG,MIDDLE,SMALL;@Overridepublic void print() {System.out.println("继承接口-重写方法一次");}
    }
    
    1. 枚举可以用等号比较吗?

    肯定,因为在Enum类里面,已经重写了equals方法,而方法里面比较就是直接使用==,来比较2个对象的。所以,你在外边直接使用==也是可以的。

    在这里插入图片描述

    1. 可以继承枚举吗?

    当然不能呀,枚举类默认继承了java.lang.Enum类,一个类怎么能继承两个类呢?

    1. 枚举可以实现单例模式吗?

    枚举本身就是一种对单例设计模式友好的形式,它是实现单例模式的一种很好的方式。

    public class InstanceDemo {/*** 构造方法私有化*/private InstanceDemo(){}/*** 返回实例* @return*/public static InstanceDemo getInstance() {return Singleton.INSTANCE.getInstance();}/*** 使用枚举方法实现单利模式*/private enum Singleton {INSTANCE;private InstanceDemo instance;/*** JVM保证这个方法绝对只调用一次*/Singleton() {instance = new InstanceDemo();}public InstanceDemo getInstance() {return instance;}}//测试一下public static void main(String[] args) {InstanceDemo one =  InstanceDemo.getInstance();InstanceDemo two =  InstanceDemo.getInstance();System.out.println(one);System.out.println(two);System.out.println(one == two);}
    }
    

    创建的对象相同

    csdn.test.recursion.demo.InstanceDemo@74a14482
    csdn.test.recursion.demo.InstanceDemo@74a14482
    true
    
    1. 当使用compareTo()比较枚举时,比较的是什么?

    int compareTo(E e):比较两个枚举常量谁大谁小,其实比较的就是枚举常量在枚举类中声明的顺序;返回值可以仔细看看源码;

    一起看看,底层代码吧

     public final int compareTo(E o) {Enum<?> other = (Enum<?>)o;Enum<E> self = this;if (self.getClass() != other.getClass() && // optimizationself.getDeclaringClass() != other.getDeclaringClass())throw new ClassCastException();return self.ordinal - other.ordinal;}
    

    举个例子你就能理解了

    public class TestSeasonEnum {public static void main(String[] args) {Season season = Season.SPRING;Season season1 = Season.SUMMER;Season season2 = Season.AUTUMN;Season season3 = Season.WINTER;System.out.println(season.compareTo(season1));System.out.println(season.compareTo(season2));System.out.println(season.compareTo(season3));}
    }
    

    输出结课,详情参考源码一看便知道

    -1
    -2
    -3

    1. 当使用equals()比较枚举的时候,比较的是什么?

    枚举类型的equals()方法比较的是枚举类对象的内存地址,作用与等号等价。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/439620.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

更改远程桌面网关端口和远程Web应用程序端口

很多玩Home-Lab的小伙伴会使用远程桌面网关&#xff08;Remote Desktop Gateway&#xff09;来安全远程家庭内网的计算机&#xff0c;但由于国内电信法律法规的原因&#xff0c;普通家庭宽带并不能使用默认的443端口&#xff08;TCP&#xff09;和3391端口&#xff08;UDP&…

Glide完全解读

一&#xff0c;概述 glide作为android流行的图片加载框架&#xff0c;笔者认为有必要对此完全解读。glide提供了三级缓存、生命周期Destroy后自动移除缓存、自动适配ImageView&#xff0c;以及提供了各种对图片修饰的操作&#xff0c;如剪裁等。本文通过最简单的使用&#xff…

自然语言处理 TF-IDF

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…

C语言——动态内存管理(经典例题)

题1、 为什么会崩溃呢&#xff1f;&#x1f914;&#x1f914;&#x1f914; #include <stdio.h> #include <stdlib.h> #include <string.h>void GetMemory(char** p) {*p (char*)malloc(100); } void Test(void) {char* str NULL;GetMemory(&str);str…

SV-8003V 网络寻呼话筒

SV-8003V是深圳锐科达电子有限公司的一款桌面式对讲主机SV-8003V同样作为广播对讲系统的核心组成部分&#xff0c;集成有全区广播、分区广播、单点呼叫、点对点对讲、以及监听等功能。SV-8003V使用铝合金拉丝面板&#xff0c;并配有高性能的鹅颈麦克风以及高保真的全频喇叭&…

如何获得《幻兽帕鲁》隐藏帕鲁唤夜兽?13000个配种配方查询 幻兽帕鲁Steam好评率还在涨 Mac苹果电脑玩幻兽帕鲁 Crossover玩Windows游戏

《幻兽帕鲁》是一款Steam平台热门游戏&#xff0c;开放式大陆和养成式冒险结合&#xff0c;成为2024首款热门游戏&#xff0c;不过由于官方仅发布了Windows版的游戏客户端&#xff0c;Mac用户无法直接玩&#xff0c;好在有Crossover这样的神器&#xff0c;让苹果电脑也能玩上《…

FastBee开源物联网平台2.0开源版发布啦!!!

一、项目介绍 物美智能(wumei-smart)更名为蜂信物联(FastBee)。 FastBee开源物联网平台&#xff0c;简单易用&#xff0c;更适合中小企业和个人学习使用。适用于智能家居、智慧办公、智慧社区、农业监测、水利监测、工业控制等。 系统后端采用Spring boot&#xff1b;前端采用…

Django学习资料

相关链接 Django官网&#xff1a;The web framework for perfectionists with deadlines | Django Django 文档&#xff1a;Django 文档 | Django 文档 | Django

uniapp如何添加多个表单数组?

目录 一、实现思路 二、实现步骤 ①view部分展示 ②JavaScript 内容 ③css中样式展示 三、效果展示 四、小结 注意事项 总结模板&#xff1a; 一、实现思路 1.在 data 中定义一个数组&#xff0c;用于存储表单项的数据 2.在模板中使用 v-for 指令渲染表单项 3.在 methods 中…

2023年算法CDO-CNN-BiLSTM-ATTENTION回归预测(matlab)

2023年算法CDO-CNN-BiLSTM-ATTENTION回归预测&#xff08;matlab&#xff09; CDO-CNN-BiLSTM-Attention切诺贝利灾难优化器优化卷积-长短期记忆神经网络结合注意力机制的数据回归预测 Matlab语言。 切诺贝利灾难优化器Chernobyl Disaster Optimizer (CDO)是H. Shehadeh于202…

对于gzip的了解

gzip基本操作原理&#xff1a;通过消除文件中的冗余信息&#xff0c;使用哈夫曼编码等算法&#xff0c;将文件体积压缩到最小。这种数据压缩方式在网络传输中发挥了巨大作用&#xff0c;减小了传输数据的大小&#xff0c;从而提高了网页加载速度。 静态资源 Vue Vue CLl修改v…

全新PHP短网址生成系统,短链接生成系统,URL缩短器系统源码

PHP短网址系统URL缩短器平台&#xff0c;它使您可以轻松地缩短链接&#xff0c;根据受众群体的位置或平台来定位受众&#xff0c;并为缩短的链接提供分析见解。 系统使用了Laravel框架编写&#xff0c;前后台双语言使用&#xff0c;可以设置多域名&#xff0c;还可以开设套餐等…