问题引入

为了将某一数据类型的值限定在可选的合理范围内,比如季节只有四个:春夏秋冬。

什么是枚举类

Java5之后新增了enum关键字(他与class,interface关键字地位相同)用来定义枚举类,他是一个特殊的类。

可以有自己的:成员变量、方法、构造器。可以实现一个或多个接口。

一个Java源文件中最多只能定义一个public访问权限的枚举类,且改Java原文件必须和该枚举类的类名相同。

和普通类的简单区别:

1、默认继承的是java.lang.Enum类,非Object。因此不能显示的 继承其他父类。其中java.lang.Enum类实现了java.lang.Serializable和java.lang.Comparable两个接口

2、非抽象的枚举类型默认都是final修饰,因此枚举类不能派生子类。

3、枚举类的构造器只能使用private访问控制权限。省略默认private,强制写只能写private

4、枚举类的所有实例值,必须再枚举类的第一行显式罗列出,否则这个枚举类用用无法产生实例。这些实例默认public static final修饰。无需程序员添加。

自定义枚举类

代码示例:定义季节枚举类,限定春夏秋冬四个值

  1. package com.zmd.study.enum_example;
  2.  
  3. /**
  4. * @ClassName SeasonEnum
  5. * @projectName: object1
  6. * @author: Zhangmingda
  7. * @description: 定义一个季节的枚举类,春夏秋冬
  8. * date: 2021/4/3.
  9. */
  10. public enum SeasonEnum {
  11. SPRING, SUMMER, FALL, WINTER;
  12. }

查看枚举类的值.values()

  1. package com.zmd.study.enum_example;
  2.  
  3. import com.sun.org.apache.xerces.internal.dom.PSVIAttrNSImpl;
  4.  
  5. /**
  6. * @ClassName SeasonEnumTest
  7. * @projectName: object1
  8. * @author: Zhangmingda
  9. * @description: XXX
  10. * date: 2021/4/3.
  11. */
  12. public class SeasonEnumTest {
  13. public static void main(String[] args) {
  14. //打印季节枚举类的值有哪些
  15. for(SeasonEnum seasonEnum : SeasonEnum.values()){
  16. System.out.println(seasonEnum);
  17. }
  18. //应用场景,定义枚举变量,做switch case判断
  19. SeasonEnum seasonEnum = SeasonEnum.SPRING;
  20. switch (seasonEnum){
  21. case SPRING:
  22. System.out.println("春天");
  23. break;
  24. case SUMMER:
  25. System.out.println("夏天");
  26. break;
  27. case FALL:
  28. System.out.println("秋天");
  29. break;
  30. case WINTER:
  31. System.out.println("冬天");
  32. break;
  33. default:
  34. System.out.println("季节输入错误");
  35. }
  36. }
  37. }

输出

  1. SPRING
  2. SUMMER
  3. FALL
  4. WINTER
  5. 春天

枚举类 的自带方法

1、对比方法compreTo()

本身相对比初始纳入的参数的位置,例如春天SPRING比秋天FALL 提前2个位置定义,用春天对比秋天就是-2

  1. //枚举类值的对比
  2. System.out.println(SeasonEnum.SPRING.compareTo(SeasonEnum.FALL));
  3. //-2

2、name()方法获取对应值的名称

  1. //获取名字,就是对应值的字符串
  2. System.out.println(SeasonEnum.SPRING.name());
    //这个就是输出SPRING

3、ordinal()获取值在枚举类中定义的顺序

  1. //获取值在枚举类中定义的顺序
  2. System.out.println(SeasonEnum.SPRING.ordinal());
  3. //第0位输出0; 顺序从0开始...

4、Enum.valueOf()获取对应类型指定名字的枚举

  1. //获取对应枚举类型,对应名字的枚举
  2. SeasonEnum season_fall = Enum.valueOf(SeasonEnum.class,"FALL");
  3. System.out.println(season_fall);

5、成员变量、普通方法、构造方法

成员变量常用的比如name ,生产中用来释义对应的中文释义。

定义枚举值的时候直接将实例的成员变量通过构造方法赋值,例如SPRING("春天"),就是构造了一个枚举类型值,同时定义好了成员变量name。使用的时候可以直接调用getName()获取定义的name变量.

示例:季节类

  1. package com.zmd.study.enum_example;
  2.  
  3. /**
  4. * @ClassName SeasonEnum
  5. * @projectName: object1
  6. * @author: Zhangmingda
  7. * @description: 定义一个季节的枚举类,春夏秋冬
  8. * date: 2021/4/3.
  9. */
  10. public enum SeasonEnum {
  11. SPRING("春天"), SUMMER("夏天"), FALL("秋天"), WINTER("冬天");
  12. private String name;
  13.  
  14. public String getName() {
  15. return name;
  16. }
  17.  
  18. public void setName(String name) {
  19. this.name = name;
  20. }
  21.  
  22. SeasonEnum(String name) {
  23. this.name = name;
  24. }
  25. }

测试含有构造方法的枚举类

  1. public class SeasonEnumTest {
  2. public static void main(String[] args) {
  3. //测试枚举类的构造方法
  4. System.out.println(SeasonEnum.SPRING.getName());
  5. }
  6. }

枚举类可以实现接口

比如如上季节的枚举类,实现一个用来获取对应值描述的接口Info。

  1. package com.zmd.study.enum_example;
  2. public interface Info {
  3. void info();
  4. }

季节枚举类,在构造值的过程重写接口的抽象方法 info()

格式:

枚举值(构造方法传参){重写接口的抽象方法}

  1. package com.zmd.study.enum_example;
  2.  
  3. /**
  4. * @ClassName SeasonEnum
  5. * @projectName: object1
  6. * @author: Zhangmingda
  7. * @description: 定义一个季节的枚举类,春夏秋冬
  8. * date: 2021/4/3.
  9. */
  10. public enum SeasonEnum implements Info{
  11. SPRING("春天"){
  12. @Override
  13. public void info() {
  14. System.out.println("这是春天");;
  15. }
  16. }, SUMMER("夏天"){
  17. @Override
  18. public void info() {
  19. System.out.println("这是夏天");;
  20. }
  21. }, FALL("秋天"){
  22. @Override
  23. public void info() {
  24. System.out.println("这是秋天");
  25. }
  26. }, WINTER("冬天"){
  27. @Override
  28. public void info() {
  29. System.out.println("这是冬天");
  30. }
  31. };
  32. private String name;
  33.  
  34. public String getName() {
  35. return name;
  36. }
  37.  
  38. // public void setName(String name) {
  39. // this.name = name;
  40. // }
  41.  
  42. SeasonEnum(String name) {
  43. this.name = name;
  44. }
  45.  
  46. @Override
  47. public void info() {
  48. System.out.println("这是一个季节枚举类");
  49. }
  50. }

包含抽象方法和静态方法的枚举类

例如一个数学的四则运算枚举类。实现两个数的加减乘除四个值,每个值都有自己的“运算”逻辑,可以重写(共用)上一级的抽象“运算”方法

可以包含运算的抽象方法,每种运算各自通过自己的运算规则实现运算的抽象方法。

本例:抽象方法eval() 、静态方法main()。

  1. package com.zmd.study.enum_example;
  2. /**
  3. * @ClassName Operation
  4. * @projectName: object1
  5. * @author: Zhangmingda
  6. * @description: XXX
  7. * date: 2021/4/5.
  8. */
  9. public enum Operation {
  10. //加减乘除四种数学运算方法,每种方法重写了"运算" 方法
  11. PLUS{
  12. @Override
  13. public double eval(double a, double b) {
  14. return a + b;
  15. }
  16. }, MINUS{
  17. @Override
  18. public double eval(double a, double b) {
  19. return a - b;
  20. }
  21. }, TIMES{
  22. @Override
  23. public double eval(double a, double b) {
  24. return a * b;
  25. }
  26. }, DEVIDE{
  27. @Override
  28. public double eval(double a, double b) {
  29. return a / b;
  30. }
  31. };
  32. //做运算的抽象方法
  33. public abstract double eval(double a, double b);
  34. //可以枚举类可以包含静态方法,例如main方法
  35. public static void main(String[] args) {
  36. double d = Operation.PLUS.eval(1,3);
  37. System.out.println(d);
  38. }
  39. }

如上示例:1+3 输出4.0

java 数据类型:枚举类enum、对比方法compreTo()、获取名字.name()、获取对应值的枚举类Enum.valueOf()、包含构造方法和抽象方法的enum;实现接口;的更多相关文章

  1. Java:面向对象(继承,方法的重写(overide),super,object类及object类中方法的重写,父子类代码块执行顺序)

    继承: 1.继承是对某一匹类的抽象,从而实现对现实世界更好的建模. 2.提高代码的复用性. 3.extends(扩展),子类是父类的扩展. 4.子类继承父类可以得到父类的全部属性和方法.(除了父类的构 ...

  2. java:struts框架2(方法的动态和静态调用,获取Servlet API三种方式(推荐IOC(控制反转)),拦截器,静态代理和动态代理(Spring AOP))

    1.方法的静态和动态调用: struts.xml: <?xml version="1.0" encoding="UTF-8"?> <!DOCT ...

  3. Java中的equals和hashCode方法

    本文转载自:Java中的equals和hashCode方法详解 Java中的equals方法和hashCode方法是Object中的,所以每个对象都是有这两个方法的,有时候我们需要实现特定需求,可能要 ...

  4. java.sql.Types,数据库字段类型,java数据类型的对应关系

    以下转自:http://kummy.itpub.net/post/17165/172850 本文在原文基础上有增减. 本概述是从<JDBCTM Database Access from Java ...

  5. java集合(3)- Java中的equals和hashCode方法详解

    参考:http://blog.csdn.net/jiangwei0910410003/article/details/22739953 Java中的equals方法和hashCode方法是Object ...

  6. Java中的equals和hashCode方法详解

    Java中的equals和hashCode方法详解  转自 https://www.cnblogs.com/crazylqy/category/655181.html 参考:http://blog.c ...

  7. JDBC数据类型、Java数据类型、标准sql类型

    本概述是从<JDBCTM Database Access from JavaTM: A Tutorial and Annotated Reference>这本书中摘引来的.JavaSoft ...

  8. 转:Java中的equals和hashCode方法详解

    转自:Java中的equals和hashCode方法详解 Java中的equals方法和hashCode方法是Object中的,所以每个对象都是有这两个方法的,有时候我们需要实现特定需求,可能要重写这 ...

  9. Java连载57-equals重写、finalize方法、hashCode方法​

    一.关于java语言中如何比较两个字符串是否一致 1.不能使用双等号来比较两个字符串是否相等,应该使用equals方法进行比较,如例子 package com.bjpowernode.java_lea ...

随机推荐

  1. 卸载.net 5.0后使用dotnet提示Found .NET Core SDK

    之前安装了预览版本的vs2019后试了下,然后卸载了.但发现控制台执行dotnet相关命令提示Found .NET Core SDK, but did not find dotnet.dll at [ ...

  2. Codeforces 566E - Restoring Map(bitset 优化构造)

    Codeforces 题目传送门 & 洛谷题目传送门 本来说好的不做,结果今早又忍不住开了道题/qiao 我们称度为 \(1\) 的点为叶节点,度大于 \(1\) 的点为非叶节点. 首先考虑如 ...

  3. 42-Remove Nth Node From End of List

    Remove Nth Node From End of List My Submissions QuestionEditorial Solution Total Accepted: 106592 To ...

  4. 逻辑学与Prolog学习笔记

    int a = 3 + 5; 很自然.如果Matrix a, b要加呢?没有运算符重载,a + b是不行的,只能add(a, b). int a = add(3, 5)也行.如果函数名可以用+呢?+( ...

  5. acquire, acre, across

    acquire An acquired taste is an appreciation [鉴赏] for something unlikely to be enjoyed by a person w ...

  6. HTTP请求 Java API

    1.导入依赖 <dependency> <groupId>commons-httpclient</groupId> <artifactId>common ...

  7. HTML5 基础内容(元素/属性/格式化)

    HTML基础 1.HTML元素 1.1 元素指的是开始标签到结束标签的所有代码. 1.2 元素的内容是开始标签与结束标签之间的内容. 1.3大多数HTML元素可用有属性. 1.4标签可以拥有属性为元素 ...

  8. 纯CSS圆环与圆

    1. 两个标签的嵌套: <div class="element1"> <div class="child1"></div> ...

  9. mysql 报 'Host ‘XXXXXX’ is blocked because of many connection errors'

    1. 问题:服务启动时,日志报错,导致启动失败: Caused by: com.mysql.cj.exceptions.CJException: null,  message from server: ...

  10. maven的lifecycle

    1.maven clean. 清理项目的target目录 2.maven compile 编译项目 3.maven test 编译项目后,再执行Junit测试方法 4.maven package 编译 ...