今天在看lucene源代码是看到其中的Store、Index等几个枚举类型里面不仅定义了方法,而其实例中也定义了方法,晚上回来又学习了一下Enum,整理写了这个博客。
第一个代码片段:
package com.lfl.em; public enum Coin { penny("10p"), dollor("20$"), rmb("30¥"); private String value; public String getValue() { return value; } Coin(String value) { this.value = value; } public static void main(String[] args) { Coin coin = Coin.dollor; System.out.println(coin.getValue()); System.out.println(coin.getDeclaringClass()); } }
coin.getDeclaringClass() 输出 com.lfl.em.Coin
第二个代码片段:
package com.lfl.em; public interface ISeason { public String mySeason(); }
package com.lfl.em; public class SeasonImpl implements ISeason { public enum Season implements ISeason { SPRING { @Override public String yourSeason() { return null; } }, SUMMER { public String mySeason() { return "夏季"; } @Override public String yourSeason() { return null; } }, AUTUMN { public String mySeason() { return "秋季"; } @Override public String yourSeason() { return null; } }, WINTER { public String mySeason() { return "冬季"; } @Override public String yourSeason() { return null; } }; public String mySeason() { return "未知季节"; } public static String mySeason(Season season) { if (Season.SPRING == season) { return "春季"; } else if (Season.SUMMER == season) { return "夏季"; } else if (Season.AUTUMN == season) { return "秋季"; } else if (Season.WINTER == season) { return "冬季"; } return "未知季节"; } public abstract String yourSeason(); } @Override public String mySeason() { return "我和季节枚举没有关系啊!"; } public static void main(String[] args) { Season a = Season.AUTUMN; String a1 = a.mySeason(); String a2 = Season.mySeason(a); System.out.println(a1 + " == " + a2); Season s = Season.SPRING; String s1 = s.mySeason(); String s2 = Season.mySeason(s); System.out.println(s1 + " != " + s2); } }
两个输出分别为:
秋季 == 秋季
未知季节 != 春季
枚举可以通过implements实现某个接口,但不能通过extends继承某个类或枚举。
abstract不可以修饰枚举,因为枚举中定义的各个值其实是枚举的实例。
从以上两个例子可以看出 不仅枚举类型里可以定义方法,而其实例中也可以定义方法。
而枚举和枚举实例又有很“微妙”的关系,从第二个例子中可以看出枚举实例和枚举好像有继承关系,枚举实例必须实现枚举里的抽象方法;枚举或枚举实例必须实现枚举实现接口中的方法,在这个例子中是mySeason()方法。在eclipse提示中可以看到说枚举是枚举实例的supertype。
这种关系可能是在编译期通过编译器确立的,
对枚举的理解还不是很透彻,以上分析如果有不正确或不恰当的欢迎指正出来共同学习。
相关推荐
15 applet java可以编写两类程序,applications和applet,applications可以在控制台直接运行,与其他高级编程语言没有太大区别,而java的特色在于它具有编制小应用程序的功能,applet可以在internet上传输并在兼容...
学生提问:使用组合关系来实现复用时,需要创建两个Animal对象,是不是意味着使用组合关系时系统开销更大? 159 5.9 初始化块 159 5.9.1 使用初始化块 160 5.9.2 初始化块和构造器 161 5.9.3 静态初始化块 162 ...
补充说明:unicode编码占用两个字节,所以,char类型的变量也是占用两个字节。 备注:后面一部分回答虽然不是在正面回答题目,但是,为了展现自己的学识和表现自己对问题理解的透彻深入,可以回答一些相关的知识,...
《Java开发实战1200例》分为I、II两卷共计1200个例子,包括了开发中各个方面最常用的实例,是目前市场上实例最全面的开发类图书;书中实例来源于多位工程师的多年积累,具有很强的实用性。 本书是第II卷,以开发...
14.6.2小应用程序(JApplet)使用示例472 14.6.3对话框(JDialog)使用示例473 14.7中间容器476 14.7.1面板(JPanel)使用示例476 14.7.2滚动面板(JScrollPane)使用示例480 14.7.3分隔板(JSplitPane)使用...
Martin Odersky 用他定义的匹萨语言给了 Java世界一个很大的冲击。尽管匹萨本身没有流行 但它展现了当把面向对象和函数型语言两种风格,技术地且很有品地混搭在一起时,就形成了 自然和强有力的组合。匹萨的设计成为...
§1.3 一个完整的 Java程序.............................................................................................6 1.3.1 Java程序的结构 .........................................................
1.4 第一个Java程序 8 1.4.1 开发源代码 8 1.4.2 编译运行 9 1.5 小结 11 第2章 基本数据类型——构建Java 大厦的基础 12 2.1 源代码注释 12 2.1.1 单行注释 12 2.1.2 区域注释 12 2.1.3 文档...
这两个功能对应的语句分别是yield return和yield break。下面有2个小例子,分别没有使用yield和有使用yield。先来看第一个,当我调试时显然执行到GetResult()方法时将会跳转到方法内部并且执行完,接着再去执行输出...
次版本号:保持相对兼容性,增加主要功能特性,影响范围极小的API不兼容修改。 D .修订号:保持完全兼容性,修复BUG、新增次要功能特性等。 多选 14.关于索引的使用,下列哪些说法是正确的:BCD A .查询语句 ...
(但是请注意:两个不同但结构上等效的委托类型的实例可能会比较为相等),准确地说,两个具有相同参数列表、签名和返回类型的不同的委托类型被认为是不同的委托类型。委托实例所封装的方法集合称为调用列表。 5, ...
.NET 2.0 泛型在实际开发中的一次小应用 C#2.0 Singleton 的实现 .Net Framwork 强类型设计实践 通过反射调用類的方法,屬性,字段,索引器(2種方法) ASP.NET: State Server Gems 完整的动态加载/卸载程序集的解决方案 ...
数据结构和算法这是一个研究数据结构和算法的项目。 例子查找操作数:...net.nopainnocode.dsaa.datastructures.HashtableTest 实现具有两个堆栈的队列:net.nopainnocode.dsaa.datastructures.ImplementedQu
和 C++ 一样,C# 是大小写敏感的。半角分号(;)是语句分隔符。和 C++ 有所区别的是,C# 中没有单独的声明(头)和实现(CPP)文件。所有代码(类声明和实现)都放在扩展名为 cs 的单一文件中。 看看 C# 中的 Hello...
对某交换类进行计费测试,字冠011对应1号路由、1号子路由,有4个中继群11,12,13,14(都属于1#模块),前后两个群分别构成自环。其中11,13群向为出中继,12,14群向为入中继,对这四个群分别进行计费设置,对出入中继都...