Java高新技术之枚举
2013-05-10 13:01
225 查看
枚举的概念
枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。问题:要定义星期几或性别的变量,该怎么定义?假设用1-7分别表示星期一到星期日,但有人可能会写成int weekday = 0;或即使使用常量方式也无法阻止意外。
用普通类实现枚举功能
要求:
私有的构造方法
每个元素分别用一个公有的静态成员变量表示,每一个元素都是类类型的元素
public class Weekdays { private Weekdays() { } public final static Weekdays SUN=new Weekdays(); public final static Weekdays MON=new Weekdays(); public Weekdays nextDay() { if(this==MON){ return SUN; }else { return MON; } } public String toString() { return this==SUN?"SUM":"MON"; } public static void main(String[] args) { Weekdays weekday=Weekdays.MON; System.out.println(weekday.nextDay()); } }这里只列出了两个元素,当元素比较多的时候需要大量的if.else语句,可以定义若干公有方法或抽象方法。采用抽象方法定义nextDay就将大量的if.else语句转移成了一个个独立的类。
abstract class WeekDay { private WeekDay() { }; public final static WeekDay SUN = new WeekDay(){ @Override public WeekDay nextDay() { return SUN; } }; public final static WeekDay MON = new WeekDay(){ @Override public WeekDay nextDay() { return MON; } }; public abstract WeekDay nextDay(); public String toString() { return this == SUN ? "SUN" : "MON"; } }
枚举的基本应用
public enum Days{ SUN,MON,TUS,WED,THI,FRI,SAT; } public class EnumDemo { public static void main(String[] args) { Days days=Days.FRI; System.out.println(days); System.out.println(days.name()); System.out.println(days.getClass()); System.out.println(days.ordinal()); System.out.println(Days.valueOf("SUN")); System.out.println(Days.valueOf(Days.class, "SUN")); for(Days day:Days.values()){ System.out.println(day); } }
带有构造方法的枚举
构造方法可以有参数,可以没有参数public enum Days{ SUN(0),MON,TUS,WED,THI,FRI,SAT; private Days(){ System.out.println("first"); } private Days(int day){ System.out.println("second"); } }我们发现只要使用了枚举中的元素如Days days=Days.FRI;枚举类中的所有元素都会被初始化,等效于静态的成员变量
带有抽象方法的枚举
public enum Days{ SUN(0) { public Days nextDay() { return MON; } },MON { public Days nextDay() { return TUS; } },TUS { public Days nextDay() { return WED; } },WED { public Days nextDay() { return THI; } },THI { public Days nextDay() { return FRI; } },FRI { public Days nextDay() { return SAT; } },SAT { public Days nextDay() { return SUN; } }; private Days(){ System.out.println("first"); } private Days(int day){ System.out.println("second"); } public abstract Days nextDay(); }此时枚举中的元素,都需要复写父类的抽象方法
总结:枚举就相当于一个类,其中也可以定义构造方法、成员变量、普通方法和抽象方法。
枚举元素必须位于枚举体中的最开始部分,枚举元素列表的后要有分号与其他成员分隔。把枚举中的成员方法或变量等放在枚举元素的前面,编译器报告错误。
补充:1、枚举只有一个成员时,就可以作为一种单例的实现方式。2、switch语句支持枚举类型的数据
问题:枚举能不能继承其他类?
答:不能,因为所有的枚举都继承自java.lang.Enum类。由于Java不支持多继承,所以枚举对象不能再继承其他类。
相关文章推荐
- 黑马程序员 java高新技术<二>--java5的枚举、反射的深入讲解
- 黑马程序员 Java高新技术---枚举
- 黑马程序员——【Java高新技术】——JDK1.5新特性:静态导入、可变参数、增强型for循环、自动装箱拆箱、枚举
- 黑马程序员_Java高新技术之枚举
- 黑马程序员--java高新技术 25--枚举,反射
- Java深入(高新技术)(三):枚举
- 黑马程序员_Java高新技术——静态导入,枚举,可变参数
- 黑马程序员--java高新技术--java5的枚举
- JavaSE 拾遗(15)——JavaSE 高新技术基础增强...java5简单新特性和枚举
- Java高新技术-枚举和反射-----黑马程序员
- 黑马程序员—【Java高新技术】之eclipse开发工具枚举及JDK1.5新特性
- 黑马程序员——java高新技术:枚举
- 【黑马程序员】张孝祥Java高新技术_装箱拆箱、枚举、反射
- 黑马程序员_java高新技术 枚举
- 【黑马程序员】黑马入学准备篇:Java高新技术之 静态导入、可变参数、增强for循环、自动装箱、枚举
- Java高新技术之交通灯管理系统(java枚举,java线程池)
- Java高新技术之银行业务调度系统(java单例设计模式、java枚举)
- Java高新技术1---增强for循环 ---装箱与拆箱享元设计模式--自己写枚举--可变长度的参数
- 黑马程序员 Java高新技术---枚举
- 黑马程序员_java高新技术_枚举与反射