零基础学习之Java枚举类

  • 概述
  • JDK1.5之前
    • 创建枚举类
    • 代码示例
  • JDK1.5之后
    • 创建枚举类
    • 代码示例
  • 枚举类继承父类
    • 基本介绍
    • 代码示例
  • 枚举类实现接口
    • 基本介绍
    • 代码示例
  • 枚举类实现单例模式
    • 基本介绍
    • 代码示例

概述

枚举类是Java类中一个特殊的类,它是用来专门解决某些类型的对象是有限的几个的场景。这样的场景在我们的生活中非常常见,比如:人的性别(男,女),一年的月份(1月…12月),一年的季节(春夏秋冬),一周内天的表示法(周一…周日),彩虹的颜色(红…紫)等等,所以枚举类在实际生活中尤其的有用。

专业点说就是:枚举类型本质上也是一种类,只不过是这个类的对象是固定的几个,而不能随意让用户创建。

Java枚举类是在JDK1.5新增的类。在JDK1.5之前,需要程序员自己通过特殊的方式来定义枚举类型。在JDK1.5之后,Java支持enum关键字来快速的定义枚举类型。

下面将以JDK1.5为界限对Java枚举类进行说明

JDK1.5之前

创建枚举类

在该阶段如果想要实现一个类对外提供固定个数得对象(枚举类)的功能,需要通过程序员自己的逻辑创建类,其创建要求如下:

  • ①必须将构造器私有化
  • ②需要设置若干个公有的静态常量(想要提供的对象)
  • ③类中得对象,一定要设置为常量,不能被修改
  • ④类中如果有属性,属性不能提供set方法(防止被修改)

代码示例

Person类

package com.atguigu.bean;public class Person {private int id;private String name;private Gender gender; //对象关联public Person() {}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Gender getGender() {return gender;}public void setGender(Gender gender) {this.gender = gender;}
}

实现枚举类的功能

package com.atguigu.bean;public class Gender {//方法一:常用的public static final Gender BOY = new Gender("男孩");public static final Gender GIRL = new Gender("女孩");private final String value;private Gender(String value) {this.value=value;}public String getValue() {return value;}/*
方法二 public static final Gender BOY;public static final Gender GIRL;static {BOY = new Gender();GIRL = new Gender();}public Gender() {}*//*
方法三  public static final Gender BOY =new Gender();public static final Gender GIRL =new Gender();public Gender() {}public static Gender getBOY() {return BOY;}public static Gender getGIRL() {return GIRL;}*/
}

测试类

package com.atguigu.demo;import com.atguigu.bean.Gender;
import com.atguigu.bean.Person;public class Demo2 {public static void main(String[] args) {Person person = new Person();person.setId(10);person.setName("张三");person.setGender(Gender.BOY);System.out.println(person.getName()+"的性别是:"+person.getGender().getValue());}
}

JDK1.5之后

创建枚举类

在JDK.5之后,Java提供了enum关键字来快速的定义枚举类型,这样枚举类实现起来就非常方便了。其实现语法如下:

【修饰符】 enum 枚举类名{常量对象列表
}【修饰符】 enum 枚举类名{常量对象列表;其他成员列表;
}

虽然方便实现了,但是该方法实现枚举类也有很多需要注意的点:

  • ①枚举类的构造器默认是私有的,并且必须是私有的

  • ② 直接写对象名即可(对象与对象之间采用逗号隔开,最后使用分号)

  • ③ 默认是采用无参构造器(后期可以设置)

  • ④ 对象默认就是共有的静态的常量

  • ⑤ 对象列表必须在类的首行

  • ⑥ 如果显示的创建了有参的构造器,没有无参构造器

    对象的创建就需要使用有参构造器 ,每个对象后面加小括号

  • ⑦ JDK1.5之后switch,提供支持枚举类型,case后面可以写枚举常量名

代码示例

枚举类

package com.atguigu.bean;public enum Gender2 {//    BOY,GIRL; 无参BOY("男孩"), GIRL("女孩"); //必须在第一行private String value;Gender2(String value) {this.value =value ;}public String getValue() {return value;}@Overridepublic String toString() {return  value;}
}

测试类

package com.atguigu.demo;import com.atguigu.bean.Gender2;public class Demo3 {public static void main(String[] args) {Gender2 gender2 = Gender2.BOY; //通过类名可以调用说明是静态的,跨包是共有的//    Gender2.BOY = Gender2.Girl; 不可以更改说明是常量System.out.println(gender2.getValue());//返回该枚举类所有的常量对象,(后面会说到这个方法)Gender2[] gender21 =Gender2.values();for (int i = 0; i < gender21.length; i++) {switch(values[i]){case BOY:System.out.println(values[i]+":男孩");break;case GIRL:System.out.println(values[i]+":女孩");break;}}}

枚举类继承父类

基本介绍

枚举类默认继承的是java.lang.Enum类,因此不能再继承其他的类。继承了Enum类的枚举类默认有以下几种方法:

name(); //获取对象的名称
toString(); //返回也是对象的名称,自定义的枚举类可以再次重写
ordinal(); //返回当前对象的位置(角标)
static values(); //返回该枚举类所有的常量对象
static valueOf(String name); //根据字符串的名称,返回常量对象

注:枚举类也不能被其他类继承

代码示例

测试类

package com.atguigu.demo;
import com.atguigu.bean.Gender2;public class Demo3 {public static void main(String[] args) {Gender2 gender2 = Gender2.BOY; //获取对象的名称System.out.println(gender2.name());//返回也是对象的名称,自定义的枚举类可以再次重写System.out.println(gender2.toString());//返回当前对象的位置(角标)System.out.println(gender2.ordinal());//返回该枚举类所有的常量对象Gender2[] gender21 =Gender2.values();for (int i = 0; i < gender21.length; i++) {System.out.println(gender21[i]);}//根据字符串的名称,返回常量对象String str = "BOY";Gender2 gender22 = Gender2.valueOf(str);System.out.println(gender22);}
}

枚举类实现接口

基本介绍

枚举类虽然不能继承其他的类,但是枚举类也是类,可以实现接口,可以同时实现多个接口。可以统一实现,也可以用匿名内部类的形式,单独给某个常量对象实现抽象方法。

修饰符 类名 implements 接口名{}

注意:

  • 枚举类提供的对象个数是确定的,并且在类加载的时候对象已经产生了。所以,抽象方法的实现,可以将范围缩小到某个对象
常量对象 【(实参列表)】{对父级做扩展
}
  • 当枚举类中所有的对象都单独对抽象方法做了实现,那么公有的实现就可以删除

代码示例

public enum Gender3 implements Eat {BOY("男孩"){@Overridepublic void eat() {System.out.println("男孩吃的多");}},GIRL("女孩"){@Overridepublic void eat() {System.out.println("女孩吃的多");}};
}interface Eat{void eat();
}

枚举类实现单例模式

基本介绍

如果枚举类的对象只有一个,那么可以作为单例模式的实现。这是因为单例模式约束一个类只能实例化一个对象。目前来说在Java中,为了强制只实例化一个对象,最好的方法是使用一个枚举量。

在 Java 中使用枚举作为单例有以下几个原因:

  • 自由序列化。
  • 保证一个实例(即使通过反射也不能实例化超过一个枚举。)
  • 线程安全

代码示例

public class Singleton {public static void main(String[] args) {Singleton singleton1  = Singleton.INSTANCE;Singleton singleton2  = Singleton.INSTANCE;System.out.println(singleton1  == singleton2  );System.out.println("singleton1 ,hashCode= " + singleton1.hashCode());System.out.println("singleton2 ,hashCode = " + singleton2.hashCode());singleton1.sayOK();}
}enum Singleton{INSTANCE;public void sayOK() {System.out.println("ok~");}
}

比起睡觉,我更喜欢刷巨详细的Java枚举类,这是来自猿人的自觉呀相关推荐

  1. java switch enum对象_Java枚举类(enum)5种常见用法和3种内部方法,详细附代码

    文章目录 Java枚举类(enum)重点用法和内部方法,附代码 一.Java 枚举类(enum) 详解5种常见的用法 1.常量 2.支持switch 3.向枚举中添加新方法 4.覆盖枚举的方法 5.实 ...

  2. 罗永浩:比起悲剧英雄 我更喜欢被当成失败的小丑

    从老师到创业者,再到锤子手机的沉寂,发生在罗永浩身上的故事很多,有人说他是大忽悠,也有人认为他是值得尊敬的创业者.今日,罗永浩在个人微博称,"比起被当成悲剧英雄,我更喜欢被当成失败的小丑.& ...

  3. Jeson TX2刷机(Jetpack 4.4版本)及镜像备份与恢复的巨详细教程

    JETSON TX2镜像备份与恢复以及刷机的巨详细教程(Jetpack 4.4版本) JETSON TX2镜像备份与恢复以及刷机的巨详细教程(Jetpack 4.4版本) 刷机前的絮絮叨叨和准备工作 ...

  4. linux命令为什么这么快,为什么这么多Linux用户更喜欢命令行而不是GUI?

    为什么这么多 Linux 用户更喜欢 CLI 而非 GUI? 上次我在 Reddit 关注该问题时,遇到了一些有帮助的投稿: "处于相同的原因我更喜欢谈论指指点点和七嘴八舌. 可以很好的传达 ...

  5. 说说抖音和小红书的交互和界面设计,您更喜欢哪一个?

    2021-6-25     蓝蓝  随笔的一些文章 作者:蓝蓝设计的蓝蓝 HI,亲爱的宝宝们(视频App上常用的呢称 ),大家好,小红书和抖音是最近非常火爆的两个视频类的APP,可以说是视频APP中的 ...

  6. 纸上原型设计 VS 桌面原型工具设计,你更喜欢谁?

    2019独角兽企业重金招聘Python工程师标准>>> 纸上原型设计,作为传统的原型设计方式,简单快速,成本低廉,为大部分设计师所喜爱.而桌面原型工具设计,作为伴随电脑科技发展而出现 ...

  7. AI一分钟 | 刚爆Python将进入高考,AI就已强势进入公务员国考试卷;报告称1/4男性更喜欢跟机器人谈恋爱,真的吗?

    一分钟AI 人工智能进入国考试卷 上百万人参加2018年度国考笔试,我们距离AI还有多远? 发改委正在牵头制定智能汽车创新发展战略,2级水平以上的自动驾驶在2020年要达到10%左右 未来你会跟机器人 ...

  8. 我为什么更喜欢 Mac OS X

    我为什么更喜欢 Mac OS X 自从苹果的iPhone和iPad在市场上取得傲人的成绩之后,国内的用户对于苹果的MacBook笔记本以及iMac机器的热情也越来越高.但是很多人是买了Apple的电脑 ...

  9. PUB/SUB Pattern-Oriented Software Architecture v1巨详细读书笔记 11

    GoF的Observer有没有什么变体存在,他的别名可以叫什么?在本笔记中,Publisher-Subscriber(出版-订阅)模式为这些问题做了完美解答.在笔记的最后还描述了Pattern Sys ...

最新文章

  1. GridView 始终显示 Pager 分页行的一种方法
  2. Unity3D中使用KiiCloud总结一
  3. 怎么用latex写ppt呢?
  4. html5家谱资源网,免费家谱系统(ASP,Access,CSS,html5)
  5. [网络流24题] 航空路线问题 (费用流)
  6. [PHP] 算法-把数组排成最小的数的PHP实现
  7. android开发图片格式,Android程序开发如何处理图像格式类及图像转换
  8. jquery利用appendTo动态创建元素
  9. Linux磁盘管理之df命令详解和使用实例(查看磁盘空间占用情况)
  10. W5500以太网控制器芯片(五):实现FTP客户端
  11. 后端接口生成微信小程序二维码Api
  12. Sniffer软件简介
  13. 高等数学学习笔记(1)——微分方程解法公式
  14. (一)BST树(二叉搜索树)
  15. java 编程思想 多线程学习笔记
  16. 计算PI(π)的方法
  17. 简述一个html文档应包含几个基本标记,简述HTML文件的基本标记组成
  18. c语言 未知大小数组,关于C#:大小未知的可变长度数组
  19. AndroidStudio 快捷键大全
  20. PB 中多数据库连接问题

热门文章

  1. 数据量高并发的数据库优化
  2. SSH框架执行自己定义的SQL语句
  3. 解决RedHat中ifconfig命令不能使用的问题
  4. 不走寻常路 IBM云计算解决方案解读
  5. 类名.class的含义。
  6. 揭开ASP.NET生成随机密码的面纱
  7. php多表头表格,HTML多表头表格代码示例
  8. java 并发实例_java一些常用并发工具示例
  9. 4.3.9 ICMP协议
  10. MATLAB plot画图后横轴去除空白