学习笔记02—枚举
来源:互联网 发布:linux who am i 编辑:程序博客网 时间:2024/06/05 19:01
学习完枚举会深刻体会到枚举是一种特殊的类。个人感觉理解枚举的实现原理是最重要的。
我们完全可以自己实现与枚举相同功能的特殊类,但java提供了产品化的枚举。
枚举原理
1. 枚举
用普通类模拟枚举的原理
理解这个原理对于理解枚举非常重要
第一步:
WeekDay本来不是抽象类,nextDay是个具体的方法。
构造方法私有,这样可以禁止从外部实例化对象。
成员是WeekDay类型且被实例化。
第二步:
将nextDay改为抽象方法,成员实例化成WeekDay的匿名子类,并实现nextDay方法。源代码如下:
public abstract class WeekDay { private WeekDay() {} public static final WeekDay SUN = new WeekDay() { @Override public WeekDay nextDay() { return MON; } }; //……省略若干行 public staticfinalWeekDay SAT= newWeekDay() { @Override public WeekDay nextDay() { return SUN; } }; public abstract WeekDay nextDay(); /*public WeekDay nextDay() { WeekDay temp = null; if (this == SUN) { temp = MON; } else if (this == MON) { …… } else if (this == SAT){ temp = SUN; } return temp; }*/ public String toString() { String temp = null; if (this == SUN) { temp = "SUN"; } //……省略若干行 else if (this == SAT) { temp = "SAT"; } return temp; }}
测试类:
publicclassEnumTest { public static void main(String[] args) { WeekDay weekDay = WeekDay.MON; System.out.println(weekDay.nextDay()); }}
2. 简单枚举示例
public class EnumTest { public static void main(String[] args) { Temp t = Temp.OFF; System.out.println(t); System.out.println(Temp.valueOf("ON")); // 遍历 for (Temp a : Temp.values()) { System.out.println(a); } } // 定义一个枚举 private enum Temp { ON, OFF }}
含有构造方法的枚举
3. 含有构造放方法的枚举
枚举的元素列表必须排在最前面,加上分号,如果后面定义其他类成员的话。其他成员要在后面定义。
枚举的构造方法必须是private的,也可不写。
在元素后面加括号指明调用哪个构造方法。
private enum Temp { ON(), OFF(1); Temp() { System.out.println("first"); } Temp(int a) { System.out.println("second"); }}
4. 内部类知识回顾
内部类可以看作是外部类的成员。访问修饰符可以有四个。
而外部类只能有两个:public和默认访问修饰符。
含有抽象方法的枚举
5. 含有抽象方法的枚举
理解了普通类模拟枚举的例子,再来看下面的代码就不难理解了。
老师问红灯会变什么,有人喊黄灯。。老师说你们到底是年龄小,不注意观察生活。。。
private enum TrafficLamp { RED(30) { @Override TrafficLamp nextLamp() { // TODO Auto-generated method stub return GREEN; } }, GREEN(45) { @Override TrafficLamp nextLamp() { // TODO Auto-generated method stub return YELLOW; } }, YELLOW(5) { @Override TrafficLamp nextLamp() { // TODO Auto-generated method stub return RED; } }; abstract TrafficLamp nextLamp(); // 抽象方法 private int time; private TrafficLamp(int time) { // 构造方法 this.time = time; }}
这里面涉及到一个旧知识点。关于匿名类如何向父类构造方法传递参数
例如:new Date(300){...}
实例化一个匿名的Date子类时,默认是在子类里面调用父类的无参构造方法,但是如果加了参数就会去调用父类的有参数的构造方法。
Period.
- 学习笔记02—枚举
- 【Swift】学习笔记(九)——枚举
- Swift学习笔记——枚举
- 黑马程序员——枚举学习笔记
- 【C++】学习笔记九——枚举
- 枚举—Swift学习笔记(十一)
- 枚举 Enum学习笔记
- 学习笔记--枚举,反射
- 学习笔记之枚举
- 学习笔记--枚举
- 枚举学习笔记
- java枚举学习笔记
- 【C++学习笔记】枚举
- Java学习笔记---枚举
- Java学习笔记-枚举
- 学习笔记:java枚举
- 枚举Enum学习笔记
- OWL学习笔记之--枚举
- Java技术路线图
- android 屏幕适配1
- C#与SQL Server数据库操作
- Android: ImageView and Bitmap
- Oracle内连接、外连接
- 学习笔记02—枚举
- mybatis SqlSessionFacto SqlSession配置注入
- 谷歌携Blink来势汹汹 WebKit将成明日黄花?
- System.out.println与System.err.println的区别
- HDU 2546 饭卡( 01背包 )
- JS常用代码(4)
- 项目经理杂谈(上)_思考为何年薪没到50万!有步骤的去实现!
- oooooooookkkkkkkkkkkkkkkkkkkkkkkkk
- 汇编程序