中小型网站建设教程,沈阳哪有做网站的,微信小程序做链接网站,静态网页制作方法文章前记程序员工作久了便可能整日忙碌于“增删改查”中#xff0c;迷失方向#xff0c;毫无进步。该公众号致力于分享软件开发相关的原创干货#xff0c;助你完成从程序员到架构师的进阶之路#xff01;努力#xff01;做一个NB的Coder!在上篇文章中#xff0c;我们对Ja…文章前记程序员工作久了便可能整日忙碌于“增删改查”中迷失方向毫无进步。该公众号致力于分享软件开发相关的原创干货助你完成从程序员到架构师的进阶之路努力做一个NB的Coder!在上篇文章中我们对Java中的枚举类进行了详细的介绍。对于Enum还不了解的小伙伴可以先预习《Java中的枚举类型Enum详解》一文。通过反编译我们知道Java枚举类会在编译之后转化为一个继承了java.lang.Enum的类而我们定义的每个枚举值都会在类的初始化阶段被实例化为我们所定义的枚举类的一个对象。在枚举类被编译之后有一些方法是编译器在编译阶段写入的那这些方法有什么特点枚举类中还有一些继承来的方法它们又有哪些枚举类中的枚举值是在编译阶段被创建为对象那构造函数又在哪这篇文章我们将详细分析。1 Enum抽象类常见方法我们上篇文章已经讲过枚举类实际上继承了Enum抽象类因此Enum抽象类是所有枚举类型的基本类下面是它的常见方法ordinal()方法该方法获取的是枚举变量在枚举类中声明的顺序下标从0开始如日期中的MONDAY在第一个位置那么MONDAY的ordinal值就是0如果MONDAY的声明位置发生变化那么ordinal方法获取到的值也随之变化注意在大多数情况下我们都不应该首先使用该方法毕竟它总是变幻莫测的。compareTo(E o)方法则是比较枚举的大小注意其内部实现是根据每个枚举的ordinal值大小进行比较的。name()方法与toString()几乎是等同的都是输出变量的字符串形式。getDeclaringClass 返回该枚举变量所在的枚举类。需要再次说明的是以上的方法都是Enum抽象类的方法会被Enum的对象继承而不是Enum的静态方法。而最终枚举值被实例化成了Enum对象所以枚举值拥有以上的方法。这一块比较简单我们直接举例子说明首先我们定义一个最简单的枚举类之后我们在定义一个附带属性的枚举类接下来我们写方法进行试验最后结果我们可以看到对于每个枚举值可以调用上述的继承自Enum抽象类的方法。2 枚举类型的构造函数既然枚举值是由编译器创建为枚举类型的实例那它必然调用了构造函数。那该函数在哪呢我们能不能调用呢其实该构造函数也在Enum抽象类中。我们特意将方法注释也保留了下来可以看到该方法只能由编译器调用开发人员无法调用。所以说我们还是不要操心了只需要定义好枚举类型剩下的交给编译器。3 再论编译器插入的静态方法我们知道values()方法和valueOf(String s)方法是由编译器插入到枚举类中的静态方法。这总让人觉得怪异。而同时我们知道枚举类型中的每一个枚举值也在编译阶段被声明为了一个枚举类。关于这几点我们在上一篇文章中已经详细分析大家可以回上篇文章找回记忆。我们直接贴出通过字节码推出的代码如下有人会这么认为原来的Season枚举类中被编译器插入了values()方法和valueOf(String s)方法因此能够正常调用Season.values()如果我们使用某个枚举值如Season.AUTUMN向上转型成为Season枚举类则无法调用values()方法和valueOf(String s)方法其实这是不对的因为无论是原生的Season枚举类还是Season.AUTUMN向上转型成的Season枚举类本质上是同一个枚举类。因此都应该可以调用values()方法和valueOf(String s)方法。对此我们进行验证得到如下输出证明了笔者的猜测。4 总结通过该文章我们对枚举类中的方法进行了全面的了解枚举类在编译阶段会被编译器插入一些静态方法枚举类本身有个只有编译器能够调用的构造方法编译器会使用该方法将枚举值实例化为枚举类型的对象枚举值被实例化后继承了众多java.lang.Enum中的方法这样通过《Java中的枚举类型Enum详解》和本篇文章我们对枚举类型的原理和方法有了详细的了解。接下来我们还会有一篇文章介绍枚举类型的使用从而从原理、特性、使用三个方面对枚举类型进行详细的介绍欢迎继续关注。—END—建议原创分享不易请 赞同 后再收藏分享让你从程序员进阶架构师的原创干货欢迎关注我不错过每期的原创干货