黑马程序员-2-枚举
来源:互联网 发布:天仕博电子白板软件 编辑:程序博客网 时间:2024/06/16 02:04
------- android培训、java培训、期待与您交流! ----------
12.枚举的作用介绍
1.为什么要有枚举
1)问题:要定义星期几或性别的变量,该怎么定义?假设用1-7分别表示星期一到星期日,但有人可能
会写成 int weekday = 0;
2)枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。
枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。
1.为什么要有枚举
1)问题:要定义星期几或性别的变量,该怎么定义?假设用1-7分别表示星期一到星期日,但有人可能
会写成 int weekday = 0;
2)枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。
枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。
WeekDay weekDay = 7;定义一个新类型,用该类型定义的值只能是一个提前规定好的值,否则编译就不能通过。
2.用普通类如何实现枚举功能,定义一个Weekday的类来模拟枚举功能。
1)私有的构造方法。
2)每个元素分别用一个公有的静态成员变量表示。
3)可以有若干公有方法或抽象方法,例如,要提供nextDay方法必须是抽象的。
采用抽象方法定义nextDay就将大量的if.else语句转移成了一个个独立的类。
3.枚举的基本应用
1)举例:定义一个WeekDay的枚举。
2)扩展:枚举类的values,valueOf,name,toString,ordinal等方法
3)总结:枚举是一种特殊的类,其中的每个元素都是该类的一个实例对象,例如可以调用
WeekDay.SUN,getClass().getName和WeekDay.class.getName().
2.用普通类如何实现枚举功能,定义一个Weekday的类来模拟枚举功能。
1)私有的构造方法。
2)每个元素分别用一个公有的静态成员变量表示。
3)可以有若干公有方法或抽象方法,例如,要提供nextDay方法必须是抽象的。
采用抽象方法定义nextDay就将大量的if.else语句转移成了一个个独立的类。
3.枚举的基本应用
1)举例:定义一个WeekDay的枚举。
2)扩展:枚举类的values,valueOf,name,toString,ordinal等方法
3)总结:枚举是一种特殊的类,其中的每个元素都是该类的一个实例对象,例如可以调用
WeekDay.SUN,getClass().getName和WeekDay.class.getName().
13.用普通类模拟枚举的实现原理
1,为更好地理解枚举,若用普通类来模仿一下枚举,可参照java.awt.Color类。
采用抽象方法定义nextDay就将大量的if.else语句转移成了一个个独立的类。
如果想在一个类中编写完各个枚举类和测试调用类,那么可以将枚举类定义成调用类的内部类。
采用抽象方法定义nextDay就将大量的if.else语句转移成了一个个独立的类。
如果想在一个类中编写完各个枚举类和测试调用类,那么可以将枚举类定义成调用类的内部类。
abstract class WeekDay { private WeekDay(){} public final static WeekDay SUN=new WeekDay(){ public WeekDay nextDay() {return MON;} public String toString() {return "SUN";} }; public final static WeekDay MON=new WeekDay(){ public WeekDay nextDay() {return SUN;} public String toString() {return "MON";} }; public abstract WeekDay nextDay(); //抽象方法}
14.java5的枚举的基本应用
public class EnumTest{ public static void main(String[] args){ WeekDay weekDay2 = WeekDay.FRI; System.out.println(weekDay2); System.out.println(weekDay2.name()); System.out.println(weekDay2.ordinal()); System.out.println(WeekDay.valueOf("SAT")); System.out.println(WeekDay.values().length); } public enum WeekDay{ SUN,MON,TUE,WEd,THI,FRI,SAT; } }
15.实现带有构造方法的枚举
public class EnumTest{ public static void main(String[] args){ WeekDay weekDay2 = WeekDay.FRI; System.out.println(weekDay2); System.out.println(weekDay2.name()); System.out.println(weekDay2.ordinal()); System.out.println(WeekDay.valueOf("SAT")); System.out.println(WeekDay.values().length); } public enum WeekDay { SUN,MON,TUE,WEd,THI,FRI,SAT(1); //元素列表后有内容时,要加; private WeekDay(){ System.out.println("first"); } private WeekDay(int day){ System.out.println("second"); } } }
注:运行可看到枚举类分别用到的是哪个构造方法。
16。实现带有抽象方法的枚举
1.知识点:
1)枚举就相当于一个类,其中也可以定义构造方法,成员变量,普通方法和抽象方法。
2)枚举元素必须位于枚举体中的最开始部分,枚举元素列表的后要有分号与其他成员分隔。
把枚举中的成员方法或变量等放在枚举元素的前面,编译器报告错误。
3)带构造方法的枚举
构造方法必须定义成私有的
如果有多个构造方法,该如何选择哪个构造方法?
枚举元素MON和MON()的效果一样,都是调用默认的构造方法。
4)带方法的枚举
定义枚举TrafficLamp
实现普通的next方法
实现抽象的next方法:每个元素分别是由枚举类的子类来生成的实例对象,这些子类采用
类似内部类的方式进行定义。
增加上表示时间的构造方法
5)枚举只有一个成员时,就可以作为一种单例的实现方式。
2.代码演示:
public class Test { public static void main(String[] args) { TrafficLamp a=TrafficLamp.GREEN; System.out.println(a); System.out.println(a.nextLamp()); System.out.println(a.time); } public enum TrafficLamp { RED(30) { public TrafficLamp nextLamp(){ return GREEN; } }, GREEN(45) { public TrafficLamp nextLamp() { return YELLOW; } }, YELLOW(5) { public TrafficLamp nextLamp() { return RED; } }; public abstract TrafficLamp nextLamp(); private int time; private TrafficLamp(int time) { this.time = time; } }}
0 0
- 黑马程序员-2-枚举
- 黑马程序员---枚举学习2
- 黑马程序员_java高新技术(2)枚举
- 黑马程序员_基础加强(2) 枚举
- 黑马程序员-枚举、反射、泛型(2)
- 《黑马程序员》枚举复习
- <黑马程序员>枚举
- 黑马程序员__java_枚举
- 黑马程序员_枚举
- 黑马程序员 枚举
- 黑马程序员之枚举
- 黑马程序员-java-枚举
- 黑马程序员-枚举
- 黑马程序员_Java枚举
- 黑马程序员---枚举
- 黑马程序员:枚举
- 黑马程序员_枚举
- 黑马程序员_枚举
- Linux文件系统命令汇总
- Cocos2d-x 瓦块地图小游戏 (三) 创建和显示玩家精灵
- AMD 发布 ARM 服务器开发者工具包
- 关键帧动画CAKeyframeAnimation,可以用它来控制图像的运动轨迹
- Windows下OpenLDAP的安装与配置
- 黑马程序员-2-枚举
- 线段树<完全版>大牛啊!!
- 项目开发的基础流程
- Java 转义库 unbescape
- 上海sap顾问培训
- PL/SQL Developer中打印超长clob字段
- Microsoft Visual Studio 2010 开发记录
- 上海sap顾问培训
- linux函数之sockaddr_in结构