




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、精选优质文档-倾情为你奉上枚举 枚举类型概述1什么是枚举类型word文档的对齐方式有几种:左对齐、居中对齐、右对齐;开车的方向有几种:前、后、左、右;枚举就是有限实现个数的类型,你可能会说,byte类型也只有256个,没错,但我们真实定义为枚举的类型,一般最多也就十多个实例,再多就不会定义为枚举了。2JDK1.4之前的枚举类型在JDK1.4之前没有枚举类型,都是使用int或字符串类型来表示枚举,如果枚举只有两个选项,那么连int都用不上,只需要使用boolean类型即可。例如:BorderLayout类的方位给出五个:CENTER、EAST、SOUTH、WEST、NORTH。当使用容
2、器类的方法添加组件时:add(new Button(), “CENTER”),这是合法的,但因为String类型太过宽泛,所以可能会出现add(new Button(), “哈哈”)的调用可能,这会导致运行时出现异常。所以,JDK1.5又新增了枚举类型。3定义枚举类型定义枚举类型需要使用enum关键字,例如:public enum Direction FRONT、BEHIND、LEFT、RIGHT;Direction d = Direction.FRONT;注意,每个枚举选项之间是用逗号隔开的。如果枚举类没有构造器、方法等,在最后一个枚举选择后面可以不打分号。但是如果枚举类还有其他成员,那么就
3、要在最后一个枚举项后面添加分号了。Direction类型只有四个选项,你可以理解为这个枚举类只有四个实例对象一样。外界无法去创建新的枚举对象,只能从这四个中去选择。其实大多数时候,我们使用枚举类型还是与以及使用int或String表示的枚举一样,基本上都是很简单的。4枚举与switch1.5开始枚举类型可以在switch中使用!在1.7之后,String类型也可以放到switch中使用了。Direction d = Direction.FRONT;switch(d) case FRONT: System.out.println("前面");break;case BEHIND
4、:System.out.println("后面");break;case LEFT: System.out.println("左面");break;case RIGHT: System.out.println("右面");break;default:System.out.println("错误的方向");Direction d1 = d;System.out.println(d1);注意,在switch中,不能使用枚举类名称,例如:“case Direction.FRONT:”这是错误的,因为编译器会根据switc
5、h中d的类型来判定每个枚举类型,在case中必须直接给出与d相同类型的枚举选项,而不能再有类型。枚举类也是类1所有枚举类都是Enum的子类所有枚举类都默认是Enum类的子类,无需我们使用extends来继承。这说明Enum中的方法所有枚举类都可以的。l int compareTo(E e):比较两个枚举常量谁大谁小,其实比较的就是枚举常量在枚举类中声明的顺序,例如FRONT的下标为0,BEHIND下标为1,那么FRONT小于BEHIND;l boolean equals(Object o):比较两个枚举常量是否相等;l int hashCode():返回枚举常量的hashCode;l Stri
6、ng name():返回枚举常量的名字;l int ordinal():返回枚举常量在枚举类中声明的序号,第一个枚举常量序号为0;l String toString():把枚举常量转换成字符串;l static T valueOf(Class enumType, String name):把字符串转换成枚举常量。2枚举类的构造器枚举类也可以有构造器,构造器不能给出访问修饰,而且默认都是private构造器。因为枚举类的实例不能让外界来创建!enum Direction FRONT, BEHIND, LEFT, RIGHT;在枚举常量后面必须添加分号,因为在枚举常量后面还有其他成员时,分号是必须
7、的。枚举常量必须在枚举类中所有成员的上方声明。Direction()枚举类的构造器不可以添加访问修饰符,枚举类的构造器默认是private的。但你自己不能添加private来修饰构造器。 System.out.println("hello");3枚举类的方法再次强调,枚举类也是类,也可以有构造器、方法和属性,只是对构造器有一些限制而已。在语法上有一些怪异罢了!enum Direction FRONT, BEHIND, LEFT, RIGHT;public void fun() System.out.println("hello Enum!");Direc
8、tion.FRONT.fun给枚举类添加方法();4枚举类的属性枚举类也可以有属性。但是,如果每个枚举常量的属性值如果都相同,那就失去了意义,我们需要让每个枚举常量的属性值不同,那么就需要自己使用构造器来创建枚举常量,然后在构造器中给每个枚举常量传递不同的值。enum Direction FRONT("前面"), BEHIND("后面"), LEFT("左面"), RIGHT("右面")调用枚举类的方法;private String explain因为本类没有无参构造器,所以每个常量都需要调用本类的有参构造器。你可
9、能会说,为什么没有new,这是枚举的独有语法,你需要习惯它。;Direction(String explain) this.explain = explain;给本类添加一个实例属性explainpublic void setExplain(String explain) this.explain = explain;public String getExplain() return explain;String explain = Direction.FRONT.getExplain为本类设置一个有参构造器,本类只有这一个构造器,那么说明在声明枚举常量时必须调用本构造器。每个常量都会传递一个
10、字符串给自己的explain属性。();System.out.println(explain);5使用匿名类来创建枚举常量还可以使用匿名类来创建枚举常量,这说明枚举常量的类型是当前枚举类的子类,而且是个匿名类。这可以让每个枚举常量有自己的类型,当然有自己的类型不是目的,而是有自己的行为才是目的!但是我们知道就算给匿名类添加了自己独有的方法,也是无法调用的,因为匿名类没有名字,只能使用父类的引用指向匿名类的实例,而多态之后只能调用父类中存在的方法。所以,使用这种情况时,通常是为了让每个枚举常量重写当前枚举类中的方法(抽象方法)。enum Direction FRONT() public void
11、 fun() System.out.println("FROND:重写了fun()方法");调用枚举常量的方法!, BEHIND() public void fun() System.out.println("BEHIND:重写了fun()方法");, LEFT() public void fun() System.out.println("LEFT:重写了fun()方法");,RIGHT() public void fun() System.out.println("RIGHT:重写了fun()方法");匿名类的
12、方法来重写父类的方法。这时每个枚举常量的真实类型都是Direction的子类类型了!而且重写了fun()方法。你应该去习惯枚举常量的声明语法,虽然这与你原来创建常量的语法不同,但你也可以从中找到规律!public void fun最后一个枚举常量的声明后面是分号。() System.out.println("没有意义的方法");Direction.FRONT.fun();Direction.BEHIND.fun();Direction.LEFT.fun();Direction.RIGHT.fun();通常fun()方法应该定义为抽象的方法,因为每个枚举常量都会去重写它。你无
13、法把Direction声明为抽象类,但需要声明fun()方法为抽象方法。enum Direction FRONT() public void fun() System.out.println("FROND:重写了fun()方法");, BEHIND() public void fun() System.out.println("BEHIND:重写了fun()方法");, LEFT() public void fun() System.out.println("LEFT:重写了fun()方法");,RIGHT() public void
14、 fun() System.out.println("RIGHT:重写了fun()方法");public abstract void fun()如果在Direction类中没有fun()方法,这个类也不会有编译的问题,但是每个常量都是匿名类类型,我们是无法调用匿名类独有的方法的。只需要把fun()方法修改为抽象方法,但不可以把Direction类声明为抽象类。;枚举类的特殊方法1每个枚举类都有两个特殊方法每个枚举类都有两个不用声明就可以调用的static方法,而且这两个方法不是父类中的方法。这又是枚举类特殊的地方,下面是Direction类的特殊方法。l static Di
15、rection values():返回本类所有枚举常量;l static Direction valueOf(String name):通过枚举常量的名字返回Direction常量,注意,这个方法与Enum类中的valueOf()方法的参数个数不同。枚举的真实世界1枚举也是编译期状态其实枚举也是编译期状态,在运行时JVM并不知道什么是枚举类型。这也就是说,编译器需要把枚举类型转换成普通类。enum Direction FRONT, BEHIND, LEFT, RIGHTfinal class Direction extends Enum public static final Directio
16、n FRONT;public static final Direction BEHIND;public static final Direction LEFT;public static final Direction RIGHT;private static final Direction ENUM$VALUES;static FRONT = new Direction("FRONT", 0);BEHIND = new Direction("BEHIND", 1);LEFT = new Direction("LEFT", 2);RIGHT = new Direction("RIGHT", 3);ENUM$VALUES = new Direction FRONT, BEHIND, LEFT, RIGHT;private Direction(String s, int i) super(s, i);public static Direction values() Direction
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 珠海监管属地管理办法
- 资本运作与新质生产力
- 出行安全培训
- 全新2025年大学语文考试试题及答案
- 出租车疲劳驾驶课件
- 社会诚信体系建设考题和答案
- 2025西安市购销合同示范文本
- 2025特定条件下的赠与合同
- 2025砂石料供应合同模板
- 出入相补原理课件
- 2023年高考生物试卷(福建)(答案卷)
- 跨国知识产权争议解决机制-全面剖析
- 超星尔雅学习通《劳动通论(中国劳动关系学院)》2025章节测试附答案
- 2024年全球及中国可编程电动夹爪行业头部企业市场占有率及排名调研报告
- GB/T 6433-2025饲料中粗脂肪的测定
- 《慢性肾脏病(CKD)的诊断与治疗》课件
- 2025年湖北荆州石首市招考村“两委”后备干部100人历年高频重点提升(共500题)附带答案详解
- 物业收费员的培训
- 总医院医共体信息化建设项目公开文件招投标书范本
- 参考建筑工程各项应急救援演练记录
- 设计版权授权合同范例
评论
0/150
提交评论