一、什么情况下使用枚举类?

有的时候一个类的对象是有限且固定的,这种情况下我们使用枚举类就比较方便?

二、为什么不用静态常量来替代枚举类呢?

public static final int SEASON_SPRING = 1;public static final int SEASON_SUMMER = 2;public static final int SEASON_FALL = 3;public static final int SEASON_WINTER = 4;

枚举类更加直观,类型安全。使用常量会有以下几个缺陷:

1. 类型不安全。若一个方法中要求传入季节这个参数,用常量的话,形参就是int类型,开发者传入任意类型的int类型值就行,但是如果是枚举类型的话,就只能传入枚举类中包含的对象。

2. 没有命名空间。开发者要在命名的时候以SEASON_开头,这样另外一个开发者再看这段代码的时候,才知道这四个常量分别代表季节。

三、枚举类入门

先看一个简单的枚举类。

packageenumcase;public enumSeasonEnum {

SPRING,SUMMER,FALL,WINTER;

}

enum和class、interface的地位一样

使用enum定义的枚举类默认继承了java.lang.Enum,而不是继承Object类。枚举类可以实现一个或多个接口。

枚举类的所有实例都必须放在第一行展示,不需使用new 关键字,不需显式调用构造器。自动添加public static final修饰。

使用enum定义、非抽象的枚举类默认使用final修饰,不可以被继承。

枚举类的构造器只能是私有的。

四、枚举类介绍

枚举类内也可以定义属性和方法,可是是静态的和非静态的。

packageenumcase;public enumSeasonEnum {

SPRING("春天"),SUMMER("夏天"),FALL("秋天"),WINTER("冬天");privatefinal String name;privateSeasonEnum(String name)

{this.name =name;

}publicString getName() {returnname;

}

}

实际上在第一行写枚举类实例的时候,默认是调用了构造器的,所以此处需要传入参数,因为没有显式申明无参构造器,只能调用有参数的构造器。

构造器需定义成私有的,这样就不能在别处申明此类的对象了。枚举类通常应该设计成不可变类,它的Field不应该被改变,这样会更安全,而且代码更加简洁。所以我们将Field用private final修饰。

五、枚举类实现接口

枚举类可以实现一个或多个接口。与普通类一样,实现接口的时候需要实现接口中定义的所有方法,若没有完全实现,那这个枚举类就是抽象的,只是不需显式加上abstract修饰,系统化会默认加上。

packageenumcase;public enumOperation {

PLUS{

@Overridepublic double eval(double x, doubley) {return x +y;

}

},

MINUS{

@Overridepublic double eval(double x, doubley) {return x -y;

}

},

TIMES{

@Overridepublic double eval(double x, doubley) {return x *y;

}

},

DIVIDE{

@Overridepublic double eval(double x, doubley) {return x /y;

}

};/*** 抽象方法,由不同的枚举值提供不同的实现。

*@paramx

*@paramy

*@return

*/

public abstract double eval(double x, doubley);public static voidmain(String[] args) {

System.out.println(Operation.PLUS.eval(10, 2));

System.out.println(Operation.MINUS.eval(10, 2));

System.out.println(Operation.TIMES.eval(10, 2));

System.out.println(Operation.DIVIDE.eval(10, 2));

}

}

Operatio类实际上是抽象的,不可以创建枚举值,所以此处在申明枚举值的时候,都实现了抽象方法,这其实是匿名内部类的实现,花括号部分是一个类体。我们可以看下编译以后的文件。

共生成了五个class文件,这样就证明了PLUS,MINUS,TIMES,DIVIDE是Operation的匿名内部类的实例。

六、switch语句里的表达式可以是枚举值

Java5新增了enum关键字,同时扩展了switch。

packageenumcase;public classSeasonTest {public voidjudge(SeasonEnum s)

{switch(s)

{caseSPRING:

System.out.println("春天适合踏青。");break;caseSUMMER:

System.out.println("夏天要去游泳啦。");break;caseFALL:

System.out.println("秋天一定要去旅游哦。");break;caseWINTER:

System.out.println("冬天要是下雪就好啦。");break;

}

}public static voidmain(String[] args) {

SeasonEnum s=SeasonEnum.SPRING;

SeasonTest test= newSeasonTest();

test.judge(s);

}

}

case表达式中直接写入枚举值,不需加入枚举类作为限定。

java什么是枚举_【JAVA】浅谈java枚举类相关推荐

  1. java执行jar中的main_浅谈java 执行jar包中的main方法

    浅谈java 执行jar包中的main方法 通过 OneJar 或 Maven 打包后 jar 文件,用命令: java -jar ****.jar 执行后总是运行指定的主方法,如果 jar 中有多个 ...

  2. java 中的单元测试_浅谈Java 中的单元测试

    单元测试编写 Junit 单元测试框架 对于Java语言而言,其单元测试框架,有Junit和TestNG这两种, 下面是一个典型的JUnit测试类的结构 package com.example.dem ...

  3. java接口与类相同不同_浅谈java的接口和C++虚类的相同和不同之处

    C++虚类相当于java中的抽象类,与接口的不同之处是: 1.一个子类只能继承一个抽象类(虚类),但能实现多个接口 2.一个抽象类可以有构造方法,接口没有构造方法 3.一个抽象类中的方法不一定是抽象方 ...

  4. java对象头_浅谈java对象结构 对象头 Markword

    概述 对象实例由对象头.实例数据组成,其中对象头包括markword和类型指针,如果是数组,还包括数组长度; | 类型 | 32位JVM | 64位JVM| | ------ ---- | ----- ...

  5. java bitset用途_浅谈Java BitSet使用场景和代码示例

    搜索热词 @H_502_0@一.什么是BitSet? @H_502_0@ 注:以下内容来自JDK API: @H_502_0@ BitSet类实现了一个按需增长的位向量.位Set的每一个组件都有一个b ...

  6. java中修饰常量的事_浅谈java中的声明常量为什么要用static修饰

    今天定义一个类常量,想着也只有这个类可以用到,就没用static关键字修饰.结果sonar代码检查提示: Rename this field "PERSON_TYPE_USER" ...

  7. java 多线程同步_浅谈Java多线程(状态、同步等)

    Java多线程是Java程序员必须掌握的基本的知识点,这块知识点比较复杂,知识点也比较多,今天我们一一来聊下Java多线程,系统的整理下这部分内容. 一.Java中线程创建的三种方式: 1.通过继承T ...

  8. java编程double相乘_浅谈Java double 相乘的结果偏差小问题

    看下面的一段代码的运行结果: public class TestDouble { public static void main(String[] args) { double d =538.8; S ...

  9. java方法区对象类型_浅谈Java内存区域与对象创建过程

    一.java内存区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有的区域则 ...

  10. java虚拟机类加载机制浅谈_浅谈Java虚拟机(三)之类加载机制

    在<浅谈Java虚拟机>这篇文章中,我们提到了JVM从操作系统方面来说,可以将其看做是一个进程,分别有类加载器子系统,执行引擎子系统和垃圾收集子系统.这一篇文章就简单的来谈一下类加载器子系 ...

最新文章

  1. Python Qt GUI设计:QCalendar日历类和QDateTimeEdit时间类(基础篇—20)
  2. Spring Cloud应用开发(四:服务容错保护)
  3. 45度炸队Alpha冲刺博客集
  4. android蓝牙开启后会尝试自动连接,以编程方式配对后,Android会自动连接蓝牙设备...
  5. 用ASP.net判断上传文件类型的三种方法
  6. python在工厂中的应用_Python工厂方法
  7. 通过gparted 调整 ubuntu 磁盘
  8. Python 爬虫实例(7)—— 爬取 新浪军事新闻
  9. php 滑块 爬虫_PHP实现简易爬虫与简易采集程序
  10. 收到手机第二天就自燃?S10机主怒告三星 要求道歉并索赔1元
  11. Maven多工程项目
  12. 一个影响我现在生活状况的故事[转载]
  13. 将 url query参数 字符串转换为JSON 对象
  14. Qt实现窗口跳转(类似于看图软件中下一张和上一张)
  15. 26个英语字母表及字母音标
  16. 马克思趣味数学题用java_在马克思手稿中有一道趣味的数学问题
  17. 钉钉视频下载方法地瓜网络钉钉视频下载器
  18. 250. Count Univalue Subtrees
  19. vuex 中出现[vuex] module namespace not found in mapActions(): money找不到的报错
  20. luoguP4313 文理分科

热门文章

  1. dsp软件单元测试,TMS320F2812DSP捕获单元测速 图文精.docx
  2. 北大施柏鑫:从审稿人视角,谈谈怎么写一篇CVPR论文
  3. 达势股份IPO前紧急叫停:年内已有多家公司急刹车,王怡为董事长
  4. video标签在安卓下微信x5浏览器的一些问题
  5. 2019最新撩妹聊天技巧恋爱神器
  6. javaScript Popup.js
  7. web复习--css
  8. 用Powerpoint打开ppt文件出现提示:PowerPoint无法显示文件中某些幻灯片中的文字、图像或对象,“xx.ppt”解决办法
  9. python爬取知乎热搜_Python知乎热门话题数据的爬取实战
  10. 哪种灯对眼睛视力保护最好?盘点五款全光谱光照的护眼台灯