黑马程序员-高新技术(枚举)
来源:互联网 发布:输入数据生成图表 编辑:程序博客网 时间:2024/06/05 08:17
-----------android培训、java培训、java学习型技术博客、期待与您交流! ------------
一、枚举的作用介绍
1、为什么要有枚举
问题:要定义星期几或性别的变量,该怎么定义?
假设用1-7分别表示星期一到星期日,但有人可能会写成 int weekday = 0;
有的用0~6表示,当一个项目有很多人同时在开发时,为了同一,于是枚举就用上了,
枚举就是要让每个类型的变量的取值只能为若干个固定值中的一个,否则编译器就会报错。
枚举可以让编译器在编译的时候就可以控制源程序中填写的非法值,普通变量的方式
在开发阶段无法实现这一目标。
2、用普通类如何实现枚举功能?
定义一个Weekday的类来模拟枚举功能。
1)私有的构造方法
2)每个元素分别用一个公有的静态成员变量表示
3)可以有若干公有方法或抽象方法,例如,要提供nextDay方法必须是抽象的,这样就将大量的if.else语句转移成了一个个独立的类。
二、枚举的特性(重点)
1、创建enum时,编译器会为你生成一个相对应的同名的类,这个类有2个重要特点:
(1)这个类继承自java.lang.Enum,由于java不支持多重继承,所以该enum不能再继承其他的类;
(2)编译器自动将这个类标记为final类,所以该类不能被继承从而产生子类。
2、除了上述2个特点,enum和普通的类没有不同,我们可以向enum中添加方法,甚至可以添加main( )方法。
3、enum虽然不能再继承其他类,但在我们创建一个新的enum时,可以同时实现一个或多个接口。
三、枚举的构造器
1、只能在enum定义的内部使用其构造器一次性创建你声明的enum实例对象。一旦enum的定义结束,编译器就不允许我们再使用其构造器来创建任何实例对象了。
个人理解:从这个角度讲,enum属于单例设计模式。
2、如果你打算定义自己的方法,那么必须在enum实例序列的最后添加一个分号。同时,java要求你必须在定义任何方法或属性之前先定义enum实例对象,否则编译报错。
代码示例:
// The witches in the land of Oz.public enum OzWitch {// Instances must be defined first, before methods:WEST("Miss Gulch, aka the Wicked Witch of the West"), NORTH("Glinda, the Good Witch of the North"), EAST("Wicked Witch of the East, wearer of the Ruby "+ "Slippers, crushed by Dorothy's house"), SOUTH("Good by inference, but missing");private String description;// Constructor must be package or private access:private OzWitch(String description) {this.description = description;}public String getDescription() {return description;}public static void main(String[] args) {for (OzWitch witch : OzWitch.values())System.out.println(witch + ": " + witch.getDescription());}} /*Output: WEST: Miss Gulch, aka the Wicked Witch of the WestNORTH: Glinda, the Good Witch of the NorthEAST: Wicked Witch of the East, wearer of the Ruby Slippers, crushed by Dorothy's houseSOUTH: Good by inference, but missing */// :~
四、枚举的基本应用
枚举就相当于一个类,其中也可以定义构造方法,成员变量,普通方法和抽象方法。
枚举元素必须位于枚举体中的最开始部分,枚举元素列表的或面要有分号与其他成员分隔。
如果把枚举中的成员方法或变量等放在枚举元素的前面,编译器报错。
举例:定义一个Weekday的枚举。
扩展:枚举类的value,valueOf,name,toString,ordinal等方法。
总结:枚举是一种特殊的类,其中的每个元素都是该类的一个实例对象,
例如可以调用
WeekDay.SUM.getClass().getName()和
WeekDay.class.getName()。
代码示例:
class Demo{ 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("SUN").toString()); System.out.println(WeekDay.values().length); } public enum WeekDay{ SUN,MON,TUE,WED,THI,FRI,SAT; //这个分号可写可不写 }}/*结果FRIFRI5SUN7*/
五、实现带有构造方法的枚举
构造方法必须定义成私有的
如果有多个构造方法,该如何选择哪个构造方法?
枚举元素MON和MON()的效果一样,都是调用默认的构造方法。
代码示例:
class Demo {public static void main(String[] args) {WeekDay today = WeekDay.SAT;System.out.println(today+"的下一天是"+today.nextDay());}}class WeekDay { //构造函数private WeekDay(){}//创建星期的七个对象public final static WeekDay SUN = new WeekDay();public final static WeekDay MON = new WeekDay();public final static WeekDay TUE = new WeekDay();public final static WeekDay WED = new WeekDay();public final static WeekDay THU = new WeekDay();public final static WeekDay FN = new WeekDay();public final static WeekDay SAT = new WeekDay(); //下一天的方法public WeekDay nextDay() { if(this==SUN) return MON; else if(this==MON) return TUE; else if(this==TUE) return WED; else if(this==WED) return THU; else if(this==THU) return FN; else if(this==FN) return SAT; else return SUN;} //重写toString()方法public String toString(){ if (this == SUN) return "星期日"; else if(this==MON) return "星期一"; else if(this==TUE) return "星期二"; else if(this==WED) return "星期三"; else if(this==THU) return "星期四"; else if(this==FN) return "星期五"; else return "星期六";}}
六、实现带有抽象方法的枚举
1、定义枚举TrafficLamp
2、实现普通的next方法
3、实现抽象的next方法:
每个元素分别是由枚举类的子类来生产的实例对象,
这些子类采用类似内部类的方式进行定义。
4、增加上表示时间的构造方法
如果枚举元素后面没有大括号对,那是不会生产内部类的。
先看有内部类的效果,再看没有内部类的效果,eclipse自动删除原来的内部类。
枚举只有一个成员时,就可以作为一种单例的实现方式。
class Demo{public static void main(String[] args){ WeekDay today = WeekDay.SAT; System.out.println("SAT的下一天为"+today.nextDay());}//创建枚举public enum WeekDay {SUN {public WeekDay nextDay()return MON;},MON {public WeekDay nextDay()return TUE;},TUE {public WeekDay nextDay()return WED;},WED {public WeekDay nextDay()return THU;},THU {public WeekDay nextDay()return FN;},FN {public WeekDay nextDay()return SAT;},SAT {public WeekDay nextDay()return SUN;};public abstract WeekDay nextDay();//创建抽象方法nextDay(),返回的对象是类的本身WeekDay。}}
- 黑马程序员-------(高新技术)枚举
- 黑马程序员-高新技术(枚举)
- 黑马程序员-高新技术-枚举
- 黑马程序员-高新技术-枚举
- 黑马程序员——高新技术(枚举)
- 黑马程序员--高新技术(枚举和反射)
- 黑马程序员_java高新技术 枚举
- 黑马程序员_高新技术枚举
- 黑马程序员-高新技术-1枚举
- 黑马程序员 Java高新技术---枚举
- 黑马程序员高新技术枚举类
- 黑马程序员---高新技术之枚举
- 黑马程序员_java高新技术--枚举
- 黑马程序员---高新技术之枚举
- 黑马程序员----高新技术之 枚举
- 黑马程序员--java高新技术----枚举
- 黑马程序员------java高新技术、枚举
- java高新技术_枚举反射内省(黑马程序员)
- GIF文件格式分析
- 淘宝搜索算法综述之二:淘宝搜索排序算法的现状
- eclipse运行android项目时,出现“launching has encountered a problem...”的问题
- STS或者Eclipse在debug时弹框提示”Unable to install breakpoint in class...“解决之道
- VerySource (文件,代码下载)
- 黑马程序员-高新技术(枚举)
- java读取excel内容
- CSS常见技巧与经验收集
- 第五章(01)Java内存管理
- ios 中使用 Search Display Controller 来对 UITableView 进行前台查询
- IOS开发(1)之UIAlertView
- Sublime Text 2 – SFTP/FTP 安装与使用
- Asp.net 学习笔记
- hdu(1019)n个数的最小公倍数。。