问题引入

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

什么是枚举类

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修饰。无需程序员添加。

自定义枚举类

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

package com.zmd.study.enum_example;

/**
* @ClassName SeasonEnum
* @projectName: object1
* @author: Zhangmingda
* @description: 定义一个季节的枚举类,春夏秋冬
* date: 2021/4/3.
*/
public enum SeasonEnum {
SPRING, SUMMER, FALL, WINTER;
}

查看枚举类的值.values()

package com.zmd.study.enum_example;

import com.sun.org.apache.xerces.internal.dom.PSVIAttrNSImpl;

/**
* @ClassName SeasonEnumTest
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/4/3.
*/
public class SeasonEnumTest {
public static void main(String[] args) {
//打印季节枚举类的值有哪些
for(SeasonEnum seasonEnum : SeasonEnum.values()){
System.out.println(seasonEnum);
}
//应用场景,定义枚举变量,做switch case判断
SeasonEnum seasonEnum = SeasonEnum.SPRING;
switch (seasonEnum){
case SPRING:
System.out.println("春天");
break;
case SUMMER:
System.out.println("夏天");
break;
case FALL:
System.out.println("秋天");
break;
case WINTER:
System.out.println("冬天");
break;
default:
System.out.println("季节输入错误");
}
}
}

输出

SPRING
SUMMER
FALL
WINTER
春天

枚举类 的自带方法

1、对比方法compreTo()

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

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

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

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

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

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

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

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

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

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

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

示例:季节类

package com.zmd.study.enum_example;

/**
* @ClassName SeasonEnum
* @projectName: object1
* @author: Zhangmingda
* @description: 定义一个季节的枚举类,春夏秋冬
* date: 2021/4/3.
*/
public enum SeasonEnum {
SPRING("春天"), SUMMER("夏天"), FALL("秋天"), WINTER("冬天");
private String name; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} SeasonEnum(String name) {
this.name = name;
}
}

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

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

枚举类可以实现接口

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

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

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

格式:

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

package com.zmd.study.enum_example;

/**
* @ClassName SeasonEnum
* @projectName: object1
* @author: Zhangmingda
* @description: 定义一个季节的枚举类,春夏秋冬
* date: 2021/4/3.
*/
public enum SeasonEnum implements Info{
SPRING("春天"){
@Override
public void info() {
System.out.println("这是春天");;
}
}, SUMMER("夏天"){
@Override
public void info() {
System.out.println("这是夏天");;
}
}, FALL("秋天"){
@Override
public void info() {
System.out.println("这是秋天");
}
}, WINTER("冬天"){
@Override
public void info() {
System.out.println("这是冬天");
}
};
private String name; public String getName() {
return name;
} // public void setName(String name) {
// this.name = name;
// } SeasonEnum(String name) {
this.name = name;
} @Override
public void info() {
System.out.println("这是一个季节枚举类");
}
}

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

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

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

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

package com.zmd.study.enum_example;

/**
* @ClassName Operation
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/4/5.
*/
public enum Operation {
//加减乘除四种数学运算方法,每种方法重写了"运算" 方法
PLUS{
@Override
public double eval(double a, double b) {
return a + b;
}
}, MINUS{
@Override
public double eval(double a, double b) {
return a - b;
}
}, TIMES{
@Override
public double eval(double a, double b) {
return a * b;
}
}, DEVIDE{
@Override
public double eval(double a, double b) {
return a / b;
}
};
//做运算的抽象方法
public abstract double eval(double a, double b);
//可以枚举类可以包含静态方法,例如main方法
public static void main(String[] args) {
double d = Operation.PLUS.eval(1,3);
System.out.println(d);
}
}

如上示例: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. 洛谷 P7450 - [THUSCH2017] 巧克力(斯坦纳树+随机化)

    洛谷题面传送门 9.13 补之前 8.23 做的题,不愧是鸽子 tzc( 首先我们先来探讨一下如果 \(c_{i,j}\le k\) 怎么做,先考虑第一问.显然一个连通块符合条件当且仅当它能够包含所有 ...

  2. ARC 119 补题记录

    这把感觉质量很高. \(E\) \(E\)比较简单所以先写个\(E\),考虑就一个置换操作来说改变的只有两端的值. 考虑\(|a_i - a_{i - 1}|\)变成区间,则我们考虑分类讨论,发现只有 ...

  3. Atcoder Grand Contest 002 F - Leftmost Ball(dp)

    Atcoder 题面传送门 & 洛谷题面传送门 这道 Cu 的 AGC F 竟然被我自己想出来了!!!((( 首先考虑什么样的序列会被统计入答案.稍微手玩几组数据即可发现,一个颜色序列 \(c ...

  4. 【蛋白质基因组】Proteogenomics方法介绍及分析思路

    概念 利用蛋白质组学数据,结合基因组数据(DNA).转录组数据(RNA)来研究基因组注释问题,被称为蛋白质基因组学."蛋白质基因组学"一词由Jaffe 等于2004 年首次提出,作 ...

  5. cat的生产应用

    web日志文件的合并 cat one.log two.log >all.log sort -k 4 all.log   按照第四列进行时间排序

  6. jenkins原理简析

    持续集成Continuous Integration(CI) 原理图: Gitlab作为git server.Gitlab的功能和Github差不多,但是是开源的,可以用来搭建私有git server ...

  7. 学习java的第二十五天

    一.今日收获 1.java完全学习手册第三章算法的3.2排序,比较了跟c语言排序上的不同 2.观看哔哩哔哩上的教学视频 二.今日问题 1.快速排序法的运行调试多次 2.哔哩哔哩教学视频的一些术语不太理 ...

  8. eclipse上安装 windowBuilder方法

    最近因为需要用java Swing做一些组件设计,但想想以前在大学时候为了布局组件和位置设计花了很多时间.所以再网上查了一些带有可视化的设计插件用来提高工作效率. 其中一个是 windowBuilde ...

  9. 【Git项目管理】Git分支 - 远程分支

    远程分支 远程引用是对远程仓库的引用(指针),包括分支.标签等等. 你可以通过 git ls-remote (remote) 来显式地获得远程引用的完整列表,或者通过 git remote show ...

  10. 【分布式】ZooKeeper权限控制之ACL(Access Control List)访问控制列表

    zk做为分布式架构中的重要中间件,通常会在上面以节点的方式存储一些关键信息,默认情况下,所有应用都可以读写任何节点,在复杂的应用中,这不太安全,ZK通过ACL机制来解决访问权限问题,详见官网文档:ht ...