zoukankan      html  css  js  c++  java
  • java基础篇2之枚举

    1、为什么要有枚举

      问题:要定义星期几或者性别的变量,该怎么定义?
      假设用1-7分别表示星期一到星期日,但有人可能会写成int weekday=0;
      枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则编译器就会报错,
      枚举可以让编译器在编译时就可以控制源程序中填写的非法制,普通变量的方式在开发阶段无法实现这一目标

    2、用普通类如何实现枚举功能,定义一个WeekDay的类来模拟枚举功能
      - 私有的构造方法
      - 每个元素分别用一个公有的静态成员变量表示
      - 可以有弱冠公有方法或者抽象方法,例如,要提供nextDay方法必须使抽象的
      采用抽象方法定义nextDay就将大量的if else语句庄毅成一个个独立的类。

    public class WeekDay{
        private WeekDay(){}
        public final static WeekDay SUN = new WeekDay(){
            @Override
            public WeekDay nextDay(){
                return MON;
            }
        };
    
        public final static WeekDay MON = new WeekDay(){
            @Override
            public WeekDay nextDay(){
                return SUN;
            }
        };
    
        public abstract WeekDay nextDay();
    
        /*public WeekDay nextDay(){
            if(this == SUN){
                return MON;
            }else{
                return SUN;
            }
        }*/
    
        public String toString(){
            return this ==SUN?"SUN":"MON";
        }
    }
    
    public class EnumTest{
        WeekDay weekday = WeekDay.SUN;
        System.out.println(weekday.toString());
        System.out.println(weekday.nextDay());
    }

    3、枚举的基本应用

      扩展:枚举类的values,valueOf,name,toString,ordinal方法

      总结:枚举是一种特殊的类,其中每个元素都是该类的一个实例对象,例如 调用WeekDay.SUN.getClass().getName

    public class EnumTest{
    
            public static void main(String[] args){
                WeekDay weekday2 = WeekDay.FRI;
                System.out.println(weekday2);
                WeekDay.valueOf("SUN").toString();
                WeekDay.values().length;
            }
    
            public enum WeekDay{
                SUN,MON,TUE,WED,THI,FRI,SAT
            }
        }

    4、带有构造方法的枚举

    public class EnumTest{
            public static void main(String[] args){
                WeekDay weekday2 = WeekDay.FRI;
                System.out.println(weekday2);
                WeekDay.valueOf("SUN").toString();
                WeekDay.values().length;
            }
    
            public enum WeekDay{
                SUN(1),MON,TUE,WED,THI,FRI,SAT;
                //放在参数列表之后
                private WeekDay(){...};
                private WeekDay(int day){...};
            }
        }

    5、带有抽象方法的枚举

      

          //子类实现父类的抽象方法
            public 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;
                }
            }

    枚举只有一个成员时,就可以作为一个单例的实现方式

  • 相关阅读:
    Javascript函数声明和函数表达式
    浅谈getAttribute兼容性
    js数组去重的三种常用方法总结
    说说JSON和JSONP,也许你会豁然开朗
    web安全之跨站请求伪造
    javascript中对象的深度克隆
    三种方式实现元素水平居中显示与固定布局和流式布局概念理解
    js dom element 属性整理(原创)
    ul下的li浮动,如何是ul有li的高度
    js数组去重的4个方法
  • 原文地址:https://www.cnblogs.com/atomicbomb/p/6618690.html
Copyright © 2011-2022 走看看