黑马程序员 - 用普通类模拟枚举的实现原理

来源:互联网 发布:淘宝直播翡翠是真的吗 编辑:程序博客网 时间:2024/04/28 04:36

------- android培训、java培训、期待与您交流! ----------

定义枚举类型其实就是在定义一个类,只不过很多细节由编译器帮你补齐了,所以,某种程度上enum关键词的作用就像是class或interface.
  当使用enum定义枚举类型时,实际上所定义出来的类型是继承自java.lang.Enum类。而每个被枚举的成员其实就是定义的枚举类型的一个实例,它们都被默认为final。无法改变常数名称所设定的值,它们也是public和static的成员,这与接口中的常量限制相同。可以通过类名称直接使用它们。

下面用普通类模拟枚举的实现原理

WeekDay类 例1

package com.itsoft;public class WeekDay {private WeekDay() {}public static final WeekDay SUM = new WeekDay();//周末public static final WeekDay MON = new WeekDay();//周一public WeekDay nextDay() {//明天是周几呢    if (this == SUM)      return MON;    //...省略其他的if...else...    else      return SUM;}public String toString() {//重写toString()方法用于返回对象信息    return this == SUM ? "SUM" : "MON";}}EnumTest.javapackage com.itsoft;public class EnumTest {public static void main(String[] args) {    WeekDay weekDay = WeekDay.MON;    System.out.println(weekDay.nextDay());//输出SUM}}


将枚举类定义成调用类的内部类,就可以在一个类中编写各个枚举类和测试调用类。
WeekDay类 例2

package com.itsoft;public abstract class WeekDay {private WeekDay() {}public abstract WeekDay nextDay();/*   * 下面这段代码表示: 由于WeekDay类中定义的有抽象方法,所以它必须声明为个抽象类,不能用new直接创建对象,必须由其子类来创建对象,    * WeekDay SUM = new WeekDay() {};这个大括号{}就表示由WeekDay的子类来创建对象,该子类没有名字,   * 被称为匿名内部类,子类的具体代码就在这个大括号{}种,当然子类要覆盖父类的方法。   */public static final WeekDay SUM = new WeekDay() {    @Override    public WeekDay nextDay() {      return MON;    }};public static final WeekDay MON = new WeekDay() {    @Override    public WeekDay nextDay() {      return SUM;    }};public abstract WeekDay nextDay() {}public String toString() {    return this == SUM ? "SUM" : "MON";}}    EnumTest.javapackage com.itsoft;public class EnumTest {public static void main(String[] args) {    WeekDay weekDay = WeekDay.MON;    System.out.println(weekDay.nextDay());//输出SUM}}


0 0
原创粉丝点击