Java枚举学习笔记

2019-03-09 14:17|来源: 领悟书生

为什么要有枚举

问题:要定义星期几或性别的变量,该怎么定义?假设用1-7分别表示星期一到星期日,但有人可能会写成int weekday = 0;或即使使用常量方式也无法阻止意外。

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

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

package com.naxsu.enumtest;

/**

 * 普通类如何实现枚举功能

 */

publicabstractclass WeekDay {

    // 私有的构造方法

    private WeekDay() {

    }

    // 每个元素分别用一个公有的静态成员变量表示

    publicfinalstatic WeekDay SUN = new WeekDay() {

       @Override

       public WeekDay nextDay() {

           returnMON;

       }

    };

    publicfinalstatic WeekDay MON = new WeekDay() {

       @Override

       public WeekDay nextDay() {

           returnSUN;

       }

    };

    // 采用抽象方法定义nextDay就将大量的if.else语句转移成了一个个独立的类

    publicabstract WeekDay nextDay();

    public String toString() {

       returnthis == SUN ? "SUN" : "MON";

    }

}

@Test

publicvoid test1() {

    WeekDay weekDay = WeekDay.MON;

    System.out.println(weekDay.nextDay());

}

SUN

 

枚举的基本应用

最简单的枚举应用

package com.naxsu.enumtest;

import org.junit.Test;

publicclass EnumTest {

    publicenum EWeekDay{

       SUN,MON,TUE,WED,THI,FRI,SAT

    }

    @Test

    publicvoid test2() {

       EWeekDay weekDay = EWeekDay.FRI;

       System.out.println(weekDay);

       System.out.println(weekDay.name());

       System.out.println(weekDay.ordinal());

       System.out.println(EWeekDay.valueOf("SUN"));

       System.out.println(EWeekDay.values().length);

    }

}

FRI

FRI

5

SUN

7

 

带构造方法的枚举

/**

 * 带构造方法的枚举

 */

publicenum EWeekDay{

    //枚举元素必须位于枚举体中的最开始部分,枚举元素列表的后要有分号与其他成员分隔。

    SUN(1),MON(),TUE,WED,THI,FRI,SAT;

    //构造方法必须定义成私有的

    private EWeekDay(){

       System.out.println("调用无参构造方法");

    }

    private EWeekDay(int day){

       System.out.println("调用有参构造方法");

    }

}

 

带有抽象方法的枚举

/**

 * 带有抽象方法的枚举

 */

publicenum TrafficLamp{

    RED(30) {

       @Override

       public TrafficLamp nextLamp() {

           returnGREEN;

       }

    },GREEN(45) {

       @Override

       public TrafficLamp nextLamp() {

           returnYELLOW;

       }

    },YELLOW(5) {

       @Override

       public TrafficLamp nextLamp() {

           returnRED;

       }

    };

    publicabstract TrafficLamp nextLamp();

    privateinttime;

    private TrafficLamp(int time){

       this.time=time;

    }

}

 

项目应用举例

package com.naxsu.enumtest;

 

publicenum Gender {

    MAN{

       public String getName(){return"";}

    },WOMEN{

       public String getName(){return"";}

    };

    publicabstract String getName();

}

  本文链接:http://www.656463.com/portal.php?mod=view&aid=83,转载请注明出处

相关问答

更多
  • 再好的学习笔记也是别人的,没有比API更好的东西了。
  • 我在书店,图书馆看到过此书,感觉我不适合用此书,当然这并不绝对,也许你可以。我初学JAVA用得是《Java程序设计经典教程(融合上机操作实例)》此书非常基础,绝对的零基础。基本达到手把手的地步。再者《JAVA面向对向编程》也很好,此书对JAVA的语言点讲解比较全面。
  • 好久没碰C了,都不太记得清枚举了。Java里面好像是没有和C一样的枚举类型的,这种类似的功能可以使用Java的枚举工具类实现。名字好像是叫“Enumeration”。
  • compareToAction(Action.valueOf(args[0])); 很显然,这一句中的args数组内容为空,args[0]就会报数组越界错误。 这里需要你在运行的时候把args[0]的值传进去,像这样运行: java EnumCompareTo 参数放在这里,回车就可以正常运行了。比如: java EnumCompareTo abc
  • jstat(JVM Statistics Monitoring Tool)是用于监控虚拟机各种运行状态信息的命令行工具。他可以显示本地或远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据,在没有GUI图形的服务器上,它是运行期定位虚拟机性能问题的首选工具。 jstat位于java的bin目录下,主要利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控。可见,Jstat是轻量级的、专门针对JVM的工具,非常适用。 jstat 命令 ...
  • 其他无所谓,CPU稍稍好点,然后配个大内存,至少3GB,你想想,开个MyEclipse跑半个小时就能上七八百兆,MySQL三四百,SQLServer更恐怖,偶尔开个PS之类的也不小,所以做Java,大内存是比较有必要的。
  • 编程机器要求不高,一般5000以内i5级别8G内存满足。做代码和做图形不一样,做代码理论CPU高和内存大即可!
  • 两本书我都有过,java学习笔记是我自己买的,Head first java是老师让我们买的,不过现在早不知扔哪去了,怎么说呢,两的的风格相差比较大,而且都比较基础,如果硬是要从两者中比较好坏,我还是比较倾向于前者,知识点全面一点,但不太适合作长期的参考,可以作入门,Java学习笔记也是入门书籍,感觉字大,内容少,讲的不深,要作长期的java基础参考书买本java编程思想到是挺不错,就是有点枯燥
  • java学习笔记[2023-06-21]

    大家的笔记 http://student.csdn.net/space.php?do=blog 牛人的笔记 http://lavasoft.blog.51cto.com/all/62575 我的笔记 http://student.csdn.net/space.php?uid=209919&do=blog&view=me
  • 入门级没问题,若是想以后从事这方面工作,建议买《编程艺术》,工作中需要大量的io流,文件等操作,这个我感觉非常棒。 望采纳~~