Java枚举类接口实例原理解析
程序员文章站
2022-05-06 19:13:52
这篇文章主要介绍了java枚举类接口实例原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
枚举类可以实现一个或多个接口。与普...
这篇文章主要介绍了java枚举类接口实例原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
枚举类可以实现一个或多个接口。与普通类实现接口完全一样,枚举类实现接口时,需要实现该接口所包含的方法。
如果需要每个枚举值在调用同一个方法时呈现不同的行为,则可以让每个枚举值在{...}匿名块中实现自己的业务逻辑。
public interface igradehandler { string getgrade(string studentname); }
public enum gradehandlerenum implements igradehandler { //five grade levels a b c d e a("90~100") { @override public string getgrade(string studentname) { return studentname + " outstanding"; } }, e("0~59") { @override public string getgrade(string studentname) { return studentname + " fail"; } }; private string score; gradehandlerenum(string score) { this.score = score; } public string getscore() { return this.score; } public static void main(string[] args) { gradehandlerenum a = gradehandlerenum.a; gradehandlerenum e = gradehandlerenum.valueof("e"); system.out.println( a.getgrade("lucy")); system.out.println( e.getgrade("tom")); } }
为了方便测试,示例只定义了a和e两个等级,执行结果如下:
lucy outstanding tom fail
反编译枚举类
在《java枚举抽象方法实例解析》中介绍了枚举类型的简单使用,现在有必要来了解一下它的基本实现原理。实际上在使用关键字enum创建枚举类并编译后,编译器会生成一些相关的类,这些类继承了java api中的java.lang.enum类,也就是说通过关键字enum创建的枚举类在编译后事实上也是一个类类型而且该类继承自java.lang.enum类。
igradehandler.class gradehandlerenum.class gradehandlerenum$1.class gradehandlerenum$2.class
使用javac编译gradehandlerenum.java文件后,生成四个class文件,其中,gradehandlerenum.class是枚举类型,这也就验证前面所说的使用关键字enum定义枚举类并编译后,编译器会自动帮助我们生成一个与枚举相关的类。使用jd-gui反编译后的主要class文件如下:
import java.io.printstream; public enum gradehandlerenum implements igradehandler { // 编译后生成两个class文件gradehandlerenum$1和gradehandlerenum$2 a("90~100"), e("0~59"); private string score; //私有构造函数 private gradehandlerenum(string paramstring) { this.score = paramstring; } public string getscore() { return this.score; } public static void main(string[] paramarrayofstring) { //实例化枚举实例,变量名由系统生成 gradehandlerenum localgradehandlerenum1 = a; gradehandlerenum localgradehandlerenum2 = valueof("e"); system.out.println(localgradehandlerenum1.getgrade("lucy")); system.out.println(localgradehandlerenum2.getgrade("tom")); } } //枚举值a对应的枚举类 enum gradehandlerenum$1{ gradehandlerenum$1(string paramstring1) { super(paramstring, paramint, paramstring1, null); } public string getgrade(string paramstring) { return paramstring + " outstanding"; } } //枚举值b对应的枚举类 enum gradehandlerenum$2{ gradehandlerenum$2(string paramstring1) { super(paramstring, paramint, paramstring1, null); } public string getgrade(string paramstring) { return paramstring + " fail"; } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。