Java高新技术-枚举
2014-03-03 22:44
190 查看
说明:当一个类的对象个数固定,且不需要再创建这个类新的对象时,可以考虑用枚举。
一,枚举原理
枚举类型特有:
1.私有构造方法;
2.每个元素分别用一个公有的静态成员变量表示;
3.可以有若干个公有方法或抽象方法,抽象方法可以使每个元素(本类对象)通过覆盖具有自己独特的内容;
注:枚举类型的元素就是本类对象,但是限制了用户自己创新的对象,只能使用该类提供的对象->元素。
枚举是为了让这个类型的变量的取值只能为若干固定值中的一个。
枚举代码原理举例一:
枚举代码原理举例二:
因为对于Weekday类对象,每一个nextDay方法对应的结果都是不同而且固定的,这里可以采用将nextDay变为抽象方法,在创建元素时通过覆盖nextDay方法,将该方法返回值设为需要的指定结果。这样避免你了上面例子中多个if...else...的语句重复选择。
二,枚举
下面介绍枚举的应用。
示例1:枚举常见方法
在一个类内创建一个枚举,此时枚举类内部类,可以用成员修饰词来修饰。
示例2:包含抽象方法的枚举
在类内创建枚举时(即内部类枚举)如果枚举里有抽象方法,枚举类名前不需要加abstract关键词,枚举中每个元素要重写该抽象方法。
示例3:枚举只有一个成员是,就可以作为一种单例的实现方式
一,枚举原理
枚举类型特有:
1.私有构造方法;
2.每个元素分别用一个公有的静态成员变量表示;
3.可以有若干个公有方法或抽象方法,抽象方法可以使每个元素(本类对象)通过覆盖具有自己独特的内容;
注:枚举类型的元素就是本类对象,但是限制了用户自己创新的对象,只能使用该类提供的对象->元素。
枚举是为了让这个类型的变量的取值只能为若干固定值中的一个。
枚举代码原理举例一:
class Weekday{ //私有构造方法可以防止外部创建本类新对象; //保证创建个数; private Weekday(){}; //通过公有静态的本类对象的成员,为外部提供了获取该类对象的途径; //而且本类对象个数是可控,确定。 public static Weekday MONDAY=new Weekday(); public static Weekday TUESDAY=new Weekday(); public static Weekday WEDNESDAY=new Weekday(); public static Weekday THURSDAY=new Weekday(); public static Weekday FRIDAY=new Weekday(); public static Weekday SATURDAY=new Weekday(); public static Weekday SUNDAY=new Weekday(); public Weekday nextDay(){ /*本方法为非静态方法,当外部通过如 * Weekday today=Weeday.FRIDAY; * 获取到本类对象后,就可以通过对象调用非静态方法 */ if(this==MONDAY) return TUESDAY; if(this==TUESDAY) return WEDNESDAY; if(this==WEDNESDAY) return THURSDAY; if(this==THURSDAY) return FRIDAY; if(this==FRIDAY) return SATURDAY; //if(this==SATURDAY) return SUNDAY; } public String toString(){ if(this==MONDAY) return "MONDAY"; if(this==TUESDAY) return "TUESDAY"; if(this==WEDNESDAY) return "WEDNESDAY"; if(this==THURSDAY) return "THURSDAY"; if(this==FRIDAY) return "FRIDAY"; if(this==SATURDAY) return "SATURDAY"; return "SUNDAY"; } }
枚举代码原理举例二:
因为对于Weekday类对象,每一个nextDay方法对应的结果都是不同而且固定的,这里可以采用将nextDay变为抽象方法,在创建元素时通过覆盖nextDay方法,将该方法返回值设为需要的指定结果。这样避免你了上面例子中多个if...else...的语句重复选择。
abstract class Weekday{ //私有构造方法可以防止外部创建本类新对象; //保证创建个数; private Weekday(){}; //通过公有静态的本类对象的成员,为外部提供了获取该类对象的途径; //而且本类对象个数是可控,确定。 public static Weekday MONDAY=new Weekday(){ public Weekday nextDay(){ return TUESDAY; } }; public static Weekday TUESDAY=new Weekday(){ public Weekday nextDay(){ return WEDNESDAY; } }; public static Weekday WEDNESDAY=new Weekday(){ public Weekday nextDay(){ return THURSDAY; } }; public static Weekday THURSDAY=new Weekday(){ public Weekday nextDay(){ return FRIDAY; } }; public static Weekday FRIDAY=new Weekday(){ public Weekday nextDay(){ return SATURDAY; } }; public static Weekday SATURDAY=new Weekday(){ public Weekday nextDay(){ return SUNDAY; } }; public static Weekday SUNDAY=new Weekday(){ public Weekday nextDay(){ return MONDAY; } }; public String toString(){ if(this==MONDAY) return "MONDAY"; if(this==TUESDAY) return "TUESDAY"; if(this==WEDNESDAY) return "WEDNESDAY"; if(this==THURSDAY) return "THURSDAY"; if(this==FRIDAY) return "FRIDAY"; if(this==SATURDAY) return "SATURDAY"; return "SUNDAY"; } }
二,枚举
下面介绍枚举的应用。
示例1:枚举常见方法
在一个类内创建一个枚举,此时枚举类内部类,可以用成员修饰词来修饰。
public class Test { public static void main(String[] args) throws Exception{ //获取枚举元素方法。 Weekday today=Weekday.MON; //获取元素在枚举中的位置 System.out.println(today.ordinal()); //获取元素的枚举类名 System.out.println(today.getClass()); //通过名称获取枚举的指定元素 System.out.println(Weekday.valueOf("FRI")); //获取枚举中所有元素 Weekday[] days=Weekday.values(); } public enum Weekday{ //元素名称必须写在枚举类的第一行 SUN(),MON(1),TUE,WED,THU,FRI,SAT; //构造方法不写,如果要构造方法,则必须修饰为私有private; private Weekday(){ System.out.println("无参构造函数"); } /*当哟多个构造方法时,可以在元素后面加(); *并在()内根据构造方法的形参格式传值; *就会调用相应的构造方法 *如元素后面不加(),则默认调用无参构造函数 */ private Weekday(int a){ System.out.println("有参构造函数"+a); } public String toString(){ if(this==MON) return "MONDAY"; if(this==TUE) return "TUESDAY"; if(this==WED) return "WEDNESDAY"; if(this==THU) return "THURSDAY"; if(this==FRI) return "FRIDAY"; if(this==SAT) return "SATURDAY"; return "SUNDAY"; } } }
示例2:包含抽象方法的枚举
在类内创建枚举时(即内部类枚举)如果枚举里有抽象方法,枚举类名前不需要加abstract关键词,枚举中每个元素要重写该抽象方法。
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;} }
示例3:枚举只有一个成员是,就可以作为一种单例的实现方式
enum Student{ LiSi; //私有构造函数 private Student(){}; }
相关文章推荐
- java高新技术【3】(枚举总结)
- 黑马程序员_高新技术:2) 枚举、内省JavaBean
- Java深入(高新技术)(三):枚举
- Java高新技术之枚举
- 黑马程序员_java高新技术(2)枚举
- 黑马程序员_Java高新技术_枚举
- 黑马程序员——【Java高新技术】——JDK1.5新特性:静态导入、可变参数、增强型for循环、自动装箱拆箱、枚举
- 黑马程序员—【Java高新技术】之eclipse开发工具枚举及JDK1.5新特性
- 黑马程序员_ Java高新技术——深入Java枚举机制
- java高新技术第一天——枚举详解
- 黑马程序员——java高新技术:枚举
- java高新技术_枚举反射内省(黑马程序员)
- Java高新技术之交通灯管理系统(java枚举,java线程池)
- Java高新技术之交通灯管理系统(java枚举,java线程池)
- Java高新技术笔记:反射、多线程、泛型、枚举、javaBean、代理
- Java高新技术之枚举
- 黑马程序员_java高新技术--枚举
- 【黑马程序员】黑马入学准备篇:Java高新技术之 静态导入、可变参数、增强for循环、自动装箱、枚举
- 黑马程序员——Java高新技术之枚举
- 黑马程序员---java高新技术之枚举