天天看点

枚举                        关于枚举-----jdk1.5的新特性之一

      在软件开发中关于定义变量星期天(int weekday)的值时,刚开始我规定 int weekday = 7;但是时间长了,对int weekday = 7的规定会忘却,到下一次要定义变量int weekday = ?时,我可能会定义成0,那会和以前定义的不一致而出问题。(在多人开发中也会出现这样的问题,有人会定义成0,也有人会定义成7),使用枚举就可以避免上述情况的发生。

     定义:是指将变量的值一一列出来,变量的值只限于列举出来的值的范围内.(比如星期,就只有星期一-星期天,用枚举合适),枚举是一种特殊的类,其中的每个元素都是该类的一个实例对象,例如可以调用weekday.sun.getclass().getname()和weekday.class.getname。

                  枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。

示例:我有一个枚举 weekday

public enum weekday{

        sun,mon

}

枚举                        关于枚举-----jdk1.5的新特性之一

  fri我在枚举里面没有定义,所以编译报错。

     防止程序出错,统一变量取值,避免在开发时对一些固定变量取值前后不一的情况。

/**

 * 用普通类实现枚举原理

 * @author json

 *

 */

public class weekday {

    /**

     * 私有构造函数方法,为了防止weekday被随便的实例化

     */

    private weekday(){}

    //定义静态常量星期一

    public final static weekday mon = new weekday();

    //定义静态常量星期二

    public final static weekday tue = new weekday();

    //定义静态常量星期天

    public final static weekday sun = new weekday();

    //下面省略了星期三,四,五,六

    //...

    /**

     * 获得下一天

     * @return

     */

    public weekday nextday(){

        if(this==mon){

            return tue;

        }else if(this==tue){

            return sun;

        }else{

            return mon;

        }

    }

    //打印名字的方法

    public string tostring(){

        //当只有2个元素的时候可以只有写,但是有三个元素就不能这样写了。

        //return this == sun?"sun":"mon";//三元运算符

        if(this==sun){

            return "sun";

            return "tue";

            return "mon";

//main函数是程序入口,可以在类里面的任何地方,但是必须在一个类中

//public static void main(string[] args) {}-----------1

//public class student {

//    public static void main(string[] args) {}---------2

//}

//public static void main(string[] args) {}-----------3

//1,3错的位置,2是对的位置

public static void main(string[] args){

        //星期一的对象

        weekday mon = weekday.mon;

        system.out.println(mon.tostring());

        system.out.println(mon.nextday().tostring());

        system.out.println(mon.nextday().nextday().tostring());

输出结果:

mon

tue

sun

上面是一个简单类实现枚举的代码,对于上面的if-else,写起来是不是很麻烦呢?如有还有许多个变量,那些if-else岂不是很麻烦,于是上面的代码还可以改进改进

 * 用普通类实现枚举原理(用了抽象方法)

public abstract class weekday {

    public final static weekday mon = new weekday(){

        @override//这是注解(覆盖的意思)

        public weekday nextday() {

            // todo auto-generated method stub

        public string tostring() {

    };

    public final static weekday tue = new weekday(){

    public final static weekday sun = new weekday(){

    };

     * 获得下一天(抽象方法,类也要是抽象的类)

    public abstract weekday nextday();

     * 打印名字的方法(抽象方法,类也要是抽象的类)

    public abstract string tostring();

输出的结果是一样的,但是第二种方法比第一种方法更加的好一些。

//定义一个枚举对象

    public enum weekday{

        sun,mon,tue,wed,thi,fri,sat

    }

    public static void main(string[] args){

        //全大写的命名方式是常量的

        weekday fri= weekday.fri;

        system.out.println(fri);

        system.out.println(fri.name());//得到枚举对象的名字

        system.out.println(fri.ordinal());//排在几位

        system.out.println(fri.valueof("sun"));//返回带指定名称的指定枚举类型的枚举常量。(查看jdk帮助文档知道的)

        system.out.println(fri.valueof("wed").tostring());

        system.out.println(fri.values().length);

        system.out.println(fri.valueof("aaa"));//输入一个不存在的枚举变量,编译没错,运行报错  

枚举                        关于枚举-----jdk1.5的新特性之一

当你看到这时,并且打印出了上面的结果,那就表明你掌握了枚举的入门。接下来更进一步的了解枚举,外带一个思考题。

        //public weekday(){};//这里会报错,原因为枚举的元素列表必须位于在所有的

        //成分之前,如果枚举的元素列表后有东西,那元素列表后面得有分号';'

        sun(),mon(1),tue,wed,thi,fri,sat;

//        public weekday(){};//这里用public会报错,原因是:枚举构造函数,只有私人的非法修改是允许的。(鼠标移到小红x上,把显示出来的英语拿给google翻译)

        private weekday(){system.out.println("first");};

        private weekday(int day){system.out.println("second");};

    public static void main(string[] args){      

        weekday weekday2 = weekday.fri;

输出结果为:

first

second

     思考:sun()和mon(1)与tue和sun()他们有区别吗?为什么?还有输出结果第二行为什么是“second”?-------这里面涉及了方法的重载哈

下面是枚举的最复杂的方式---------张孝祥老师说的

public enum trafficlamp{

        //red{}代表为trafficlamp的子类

        red(30){

            @override

            public trafficlamp nextlamp() {

                // todo auto-generated method stub

                return green;

            }

        },

        //green{}代表为trafficlamp的子类

        green(45){

                return yellwo;

        //yellwo{}代表为trafficlamp的子类

        yellwo(5){

                return red;

        };

        public abstract trafficlamp nextlamp();

        private int time;

        private trafficlamp(int time){

            this.time = time;

最后有个小知识点就是:枚举只有一个成员时,就可以作为一种单例的实现方法。

上一篇: java基础加强