Java学习笔记-枚举类
实例有限且固定的类成为枚举类
枚举类的实现
- 早期时候的实现形式:
public static final int SEASON_SPRING = 1;
public static final int SEASON_SUMMER = 2;
public static final int SEASON_FAIL = 3;
public static final int SEASON_WINTER = 4;
- 这种方式虽然实现简单,但存在很多问题:
①类型不安全(二者可运算)
②没有命名空间
③打印输出的意义不明确
如今的枚举实现:
- Java5以后增加了enum关键字(与class、interface地位相同)来定义枚举。可以拥有成员变量、方法,可以实现一个或多个接口,也可定义构造器。一个Java源文件中最多只能定义一个public访问权限的枚举类,且该Java源文件也必须和该枚举类的类名相同
- 枚举类与普通类的区别:
- 枚举类可以实现一个或多个接口,使用enum定义的枚举类默认继承了java.lang.Enum类,而不是默认继承Object类,因此枚举类不能显示继承其他父类。其中java.lang.Enum类实现了java.lang.Serializable和java.lang.Comparable两个接口
- 使用enum定义、非抽象的枚举类默认会使用final修饰,因此枚举类不能派生子类
- 枚举类的构造器只能使用private访问控制符,如果省略了构造器的访问控制符,则默认使用private修饰;如果强制指定访问控制符,则只能指定private
- 枚举类的所有实例必须在枚举类的第一行显式列出,否则这个枚举类永远不能产生实例
- 枚举类默认提供了一个value()方法,该方法可以很便捷的遍历所有的枚举值
public enum SeasonEnum{
SPRING,SUMMER,FAIL,WINTER;
}
- 在使用时候可以这样:
SeasonEnum.SPRING。在switch使用时可直接用SPRING - java.lang.Enum类提供了以下方法:
int compareTo (E o):该方法用于与指定枚举对象比较顺序,同一个枚举实例只能和相同类型的枚举实例进行比较。如果该枚举对象位于指定枚举对象之后,则返回正整数;如果该枚举对象位于指定枚举对象之前,则返回负数,否则返回零String name():返回枚举实例的名称int ordinal():返回枚举值在枚举类中的索引值String toString():返回枚举常量的名称public static <T extends Enum<T>>T valueOf(Class<T> enumType,String name):返回指定枚举类中指定名称的枚举值
枚举类的成员变量、方法和构造函数
public enum Gender {
MALE,FEMALE;
// 定义一个public修饰的实例变量
public String name;
}
public enum Gender{
MALE,FEMALE;
private String name;
public void setName(String name){
switch (this){
case MALE:
if (name.equals("男")){
this.name = name;
}else{
System.out.println("参数错误");
return;
}
break;
case FEMALE:
if (name.equals("女")){
this.name = name;
}else{
System.out.println("参数错误");
return;
}
break;
}
}
public String getName(){
return this.name;
}
}
public enum Gender{
// 此处的枚举值必须调用对应构造器来创建
MALE("男"),FEMALE("女");
private final String name;
// 枚举类的构造器只能使用private修饰
private Gender(String name){
this.name = name;
}
public String getName(){
return this.name;
}
}
- 其实也就相当于以下代码:
public static final Gender MALE = new Gender("男");
public static final Gender FEMALE = new Gender("女");
实现接口的枚举类
public enum Gender implements GenderDesc{
// 此处的枚举值必须调用对应构造器来创建
MALE("男")
// 花括号部分实际上是一个类体部分
{
public void info(){
System.out.println("这个枚举值代表男性");
}
},
FEMALE("女"){
public void info(){
System.out.println("这个枚举值代表女性");
}
};
private final String name;
// 枚举类的构造器只能使用private修饰
private Gender(String name){
this.name = name;
}
public String getName(){
return this.name;
}
// 增加下面的info()方法,实现GenderDesc接口必须实现的方法
public void info(){
System.out.println("这是一个用于用于定义性别的枚举类");
}
}
- 以上就是由匿名子类实现的
包含抽象方法的枚举类
public enum Operation{
PLUS{
public double eval(double x , double y){
return x + y;
}
},
MINUS{
public double eval(double x , double y){
return x - y;
}
},
TIMES{
public double eval(double x , double y){
return x * y;
}
},
DIVIDE{
public double eval(double x , double y){
return x / y;
}
};
// 为枚举类定义一个抽象方法
// 这个抽象方法由不同的枚举值提供不同的实现
public abstract double eval(double x, double y);
public static void main(String[] args){
System.out.println(Operation.PLUS.eval(3, 4));
System.out.println(Operation.MINUS.eval(5, 4));
System.out.println(Operation.TIMES.eval(5, 4));
System.out.println(Operation.DIVIDE.eval(5, 4));
}
}
Java学习笔记-枚举类的更多相关文章
- Java学习笔记——File类之文件管理和读写操作、下载图片
Java学习笔记——File类之文件管理和读写操作.下载图片 File类的总结: 1.文件和文件夹的创建 2.文件的读取 3.文件的写入 4.文件的复制(字符流.字节流.处理流) 5.以图片地址下载图 ...
- Java学习笔记之---类和对象
Java学习笔记之---类和对象 (一)类 类是一个模板,它描述一类对象的行为和状态 例如:动物类是一个类,动物们都有属性:颜色,动物们都有行为:吃饭 public class Dog { Stri ...
- Java学习笔记-枚举类型
枚举类型 枚举类型就是预先定义的一类常量集合,如一周的时间.水果的类型等.需要注意的几点内容如下: 定义枚举类时,Java默认继承java.lang.Enum,所以定义的枚举类不能继承其他类型: 枚举 ...
- java学习笔记----枚举测试题
定义义一个交通灯枚举类,包含红灯.绿灯.黄灯,需要有获得下一个灯的方法,并实现红灯出现5秒之后变成绿灯,绿灯3秒之后变成黄灯,黄灯2秒之后变成红灯,如此循环 public class Test5 { ...
- Java学习笔记-File类的基本方法
要渐渐养成写博客的习惯-----> 前段时间看Mars的java中的I/O流没怎么懂,发现I/O流好难啊.今天重新看一遍其他教学,还有书籍,做些笔记,记录下每天的学习生活. File类的一些方法 ...
- Java学习笔记 04 类和对象
一.类和对象的概念 类 >>具有相同属性和行为的一类实体 对象 >>实物存在的实体.通常会将对象划分为两个部分,即静态部分和动态部分.静态部分指的是不能动的部分,被称为属性,任 ...
- 0018 Java学习笔记-面向对象-类的基本要素
类与对象 大街上一个个的人,就是一个个对象 类是对一群对象的抽象,比如人都有性别.年龄.姓名,都会吃饭.睡觉等.姓名性别可以抽象为变量,吃饭睡觉可以抽象为方法,像下面一样定义个类来形容人 public ...
- Java学习笔记——SequenceInputStream类合并文件的综合举例分析
SequenceInputStream 介绍 SequenceInputStream 类表示其他输入流的逻辑串联,即文件的合并. 它从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾, ...
- Java学习笔记-嵌套类
嵌套类 嵌套类有两种类别:static and non-static,分别对应为静态嵌套类和内部类. class OuterClass { ... static class StaticNestedC ...
随机推荐
- mysql:用户自定义变量关联失效
自定义变量的属性和限制 使用自定义变量的查询,无法使用查询缓存. 不能在使用常量或者标识列的地方使用自定义变量,例如表名.列明和LIMIT子句中. 用户自定义变量的生命周期是在一个连接中有效,所以不能 ...
- C# 可观察集合
static void Main() { var data = new ObservableCollection<string>(); data.CollectionChanged += ...
- BZOJ 5494: [2019省队联测]春节十二响 (左偏树 可并堆)
题意 略 分析 稍微yy一下可以感觉就是一个不同子树合并堆,然后考场上写了一发左偏树,以为100分美滋滋.然而发现自己傻逼了,两个堆一一对应合并后剩下的一坨直接一次合并进去就行了.然鹅我这个sb把所有 ...
- 多次读取HttpServletRequest的inputstream方法 问题解决
原因:我要收集所有来自前台请求的参数信息,无论在任何地方的.当前请求参数都是json格式,都写在httpservlet的body中.这个只能通过流进行获取.然后问题来了,HttpServletRequ ...
- HDU 6129 - Just do it | 2017 Multi-University Training Contest 7
比赛时脑子一直想着按位卷积... 按题解的思路: /* HDU 6129 - Just do it [ 规律,组合数 ] | 2017 Multi-University Training Contes ...
- 离线语音Snowboy热词唤醒+ 树莓派语音交互实现开关灯
离线语音Snowboy热词唤醒 语音识别现在有非常广泛的应用场景,如手机的语音助手,智能音响(小爱,叮咚,天猫精灵...)等. 语音识别一般包含三个阶段:热词唤醒,语音录入,识别和逻辑控制阶段. 热词 ...
- 关于要python爬虫你需要的一些网址和信息[待补充]
phantomjs无头浏览器(基本不用) http://phantomjs.org/download.html 如果报 下面这种错误 [root@hwgz01 ~]# phantomjs phanto ...
- 7.26T2某不科学的迷你激光炮
题目描述 身为课代表的她,下课总愿意帮老师发作业.老师的作业好多好多啊,一天 下来,她下课休息时间也无几了…… 要是天花板上有一只激光炮该多好啊!把作业塞到激光炮里面,轰——一排 同学该都拿到作业了吧 ...
- Atcoder ABC 139A
Atcoder ABC 139A 题意: 给你两个字符串,记录对应位置字符相同的个数 $ (n=3) $ 解法: 暴力枚举. CODE: #include<iostream> #inclu ...
- Linux ubuntu centos 下 grep显示前后几行信息
标准unix/linux下的grep通过下面参数控制上下文 grep -C 5 foo file 显示file文件里匹配foo字串那行以及上下5行grep -B 5 foo file 显示foo及前5 ...