学习笔记02—枚举

来源:互联网 发布:linux who am i 编辑:程序博客网 时间:2024/06/05 19:01



学习完枚举会深刻体会到枚举是一种特殊的类。个人感觉理解枚举的实现原理是最重要的。

我们完全可以自己实现与枚举相同功能的特殊类,但java提供了产品化的枚举。




枚举原理

1.      枚举

用普通类模拟枚举的原理

理解这个原理对于理解枚举非常重要


第一步:

WeekDay本来不是抽象类,nextDay是个具体的方法。

构造方法私有,这样可以禁止从外部实例化对象。

成员是WeekDay类型且被实例化。


第二步:

将nextDay改为抽象方法,成员实例化成WeekDay的匿名子类,并实现nextDay方法。源代码如下:

public abstract class WeekDay {    private WeekDay() {}    public static final WeekDay SUN = new WeekDay() {        @Override        public WeekDay nextDay() {            return MON;        }    };    //……省略若干行    public staticfinalWeekDay SAT= newWeekDay() {        @Override        public WeekDay nextDay() {            return SUN;        }    };    public abstract WeekDay nextDay();    /*public WeekDay nextDay() {        WeekDay temp = null;         if (this == SUN) {             temp = MON;         } else if (this == MON) {         ……    } else if (this == SAT){             temp = SUN;         }         return temp;    }*/    public String toString() {        String temp = null;        if (this == SUN) {            temp = "SUN";        }        //……省略若干行        else if (this == SAT) {            temp = "SAT";        }        return temp;    }}


测试类:

publicclassEnumTest {    public static void main(String[] args) {        WeekDay weekDay = WeekDay.MON;        System.out.println(weekDay.nextDay());    }}


 

2.      简单枚举示例

public class EnumTest {    public static void main(String[] args) {        Temp t = Temp.OFF;        System.out.println(t);        System.out.println(Temp.valueOf("ON"));        // 遍历        for (Temp a : Temp.values()) {            System.out.println(a);        }    }    // 定义一个枚举    private enum Temp {        ON, OFF    }}


含有构造方法的枚举

3.      含有构造放方法的枚举


枚举的元素列表必须排在最前面,加上分号,如果后面定义其他类成员的话。其他成员要在后面定义。

枚举的构造方法必须是private,也可不写。

在元素后面加括号指明调用哪个构造方法。


private enum Temp {    ON(), OFF(1);    Temp() {        System.out.println("first");    }    Temp(int a) {        System.out.println("second");    }}


 

4.      内部类知识回顾

内部类可以看作是外部类的成员。访问修饰符可以有四个。

而外部类只能有两个:public和默认访问修饰符。


含有抽象方法的枚举

5.      含有抽象方法的枚举


理解了普通类模拟枚举的例子,再来看下面的代码就不难理解了。

老师问红灯会变什么,有人喊黄灯。。老师说你们到底是年龄小,不注意观察生活。。。


private enum TrafficLamp {    RED(30) {        @Override        TrafficLamp nextLamp() {            // TODO Auto-generated method stub            return GREEN;        }    },    GREEN(45) {        @Override        TrafficLamp nextLamp() {            // TODO Auto-generated method stub            return YELLOW;        }    },    YELLOW(5) {        @Override        TrafficLamp nextLamp() {            // TODO Auto-generated method stub            return RED;        }    };    abstract TrafficLamp nextLamp(); // 抽象方法    private int time;    private TrafficLamp(int time) { // 构造方法        this.time = time;    }}


这里面涉及到一个旧知识点。关于匿名类如何向父类构造方法传递参数

例如:new Date(300){...}

实例化一个匿名的Date子类时,默认是在子类里面调用父类的无参构造方法,但是如果加了参数就会去调用父类的有参数的构造方法。

Period.

原创粉丝点击