• 黑马程序员:Java基础总结----枚举


    黑马程序员:Java基础总结



    枚举

      ASP.Net+Android+IO开发 .Net培训 、期待与您交流!




    枚举

    为什么要有枚举
    问题:要定义星期几或性别的变量,该怎么定义?假设用1-7分别表示星期一到星期日,但有人可能会写成int weekday = 0;或即使使用常量方式也无法阻止意外。
    枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。 枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。
    用普通类如何实现枚举功能,定义一个Weekday的类来模拟枚举功能。 
    私有的构造方法
    每个元素分别用一个公有的静态成员变量表示
    可以有若干公有方法或抽象方法。 采用抽象方法定义nextDay就将大量的if.else语句转移成了一个个独立的类
    枚举的基本应用
    举例:定义一个Weekday的枚举。
    扩展:枚举类的values,valueOf,name,toString,ordinal等方法(记住,讲课时要先于自定义方法前介绍,讲课更流畅)
    总结:枚举是一种特殊的类,其中的每个元素都是该类的一个实例对象,例如可以调用WeekDay.SUN.getClass().getName和WeekDay.class.getName()。


    普通方法实现枚举:
    public  class  Ts {
            public  static  void  main(String[] args) {
                System.  out .println(Weekday. mon );
          }
    }
    abstract  class  Weekday {
            private  Weekday() {
          }

            public  final  static  Weekday  mon  =  new  Weekday() {

                  @Override
                  public  Weekday nextDay() {
                        //  TODO  Auto-generated method stub
                        return  sun  ;
                }

                  @Override
                  public  String toString() {
                        //  TODO  Auto-generated method stub
                        return  "星期一"  ;
                }

          };
            public  final  static  Weekday  sun  =  new  Weekday() {

                  @Override
                  public  Weekday nextDay() {
                        //  TODO  Auto-generated method stub
                        return  mon  ;
                }

                  @Override
                  public  String toString() {
                        //  TODO  Auto-generated method stub
                        return  "星期三"  ;
                }

          };

            public  abstract  Weekday nextDay();

            @Override
            public  abstract  String toString();

    }

    简单的枚举:
    java.lang
    类 Enum<E extends Enum<E>>

    public  class  Ts {
            public  static  void  main(String[] args) {
                Weekday day = Weekday.  Mon ;
     String toString()
              返回枚举常量的名称,它包含在声明中。
                System.  out .println(day.toString()); //Mon
     String name()
              返回此枚举常量的名称,在其枚举声明中对其进行声明。
                System.  out .println(day.name()); //Mon
     int ordinal()
              返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。
                System.  out .println(day.ordinal()); //0
    static
    <T extends Enum<T>>
    T
    valueOf(Class<T> enumType, String name)
              返回带指定名称的指定枚举类型的枚举常量。
                System.  out .println(Weekday.valueOf(  "Mon" )); //Mon
    获取数组:
                System.  out .println(Weekday.values().  length ); //7

          }
    }
    enum  Weekday {
            Mon ,  Tue  ,  The ,  Wer ,  Fri ,  Sta  ,  Sun;
    }



    枚举的高级应用

    枚举就相当于一个类,其中也可以定义构造方法、成员变量、普通方法和抽象方法。
    枚举元素必须位于枚举体中的最开始部分,枚举元素列表的后要有分号与其他成员分隔。把枚举中的成员方法或变量等放在枚举元素的前面,编译器报告错误。
    带构造方法的枚举

    构造方法必须定义成私有的
    如果有多个构造方法,该如何选择哪个构造方法?
    枚举元素MON和MON()的效果一样,都是调用默认的构造方法。
    带方法的枚举
    定义枚举TrafficLamp
    实现普通的next方法
    实现抽象的next方法:每个元素分别是由枚举类的子类来生成的实例对象,这些子类采用类似内部类的方式进行定义。
    增加上表示时间的构造方法
    枚举只有一个成员时,就可以作为一种单例的实现方式。

    public  class  Ts {
            public  static  void  main(String[] args) {
                TrafficLamp lamp = TrafficLamp.  YRLLOW ;
                System.  out .println(lamp.nextLamp()); //RED
          }

            public  enum  TrafficLamp {
                  // 第一步RED{},GREEN{},YRLLOW{};
                  // 第二步
                  RED (30) {
                        @Override
                        public  TrafficLamp nextLamp() {
                              //  TODO  Auto-generated method stub
                              return  GREEN  ;
                      }

                },
                  GREEN (45) {
                        @Override
                        public  TrafficLamp nextLamp() {
                              //  TODO  Auto-generated method stub
                              return  YRLLOW  ;
                      }

                },
                  YRLLOW (5) {
                        @Override
                        public  TrafficLamp nextLamp() {
                              //  TODO  Auto-generated method stub
                              return  RED  ;
                      }

                };
                  // 构造必须私有
                  private  TrafficLamp() {
                }

                  private  TrafficLamp( int  time) {
                }

                  // 抽象方法
                  public  abstract  TrafficLamp nextLamp();
          }
    }








      ASP.Net+Android+IO开发 .Net培训 、期待与您交流!

  • 相关阅读:
    iOS中多线程的实现方案
    初识多线程
    《文献管理与信息分析》第一讲学习总结
    《构建之法》第一章读书摘要
    Total Commander的初次体验
    学习《深入理解计算机系统》第一章摘要
    Vim编辑器的学习
    关于《文献管理与信息分析》的一些问题
    阅读《构建之法》后所产生的问题
    阅读《深入理解计算机系统(第三版)》产生的一些疑惑和困惑
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3184840.html
Copyright © 2020-2023  润新知