0编译器详解_详解Java枚举类型(Enum)中的方法
程序員工作久了便可能整日忙碌于“增刪改查”中,迷失方向,毫無進步。
該公眾號致力于分享軟件開發(fā)相關的原創(chuàng)干貨,助你完成從程序員到架構師的進階之路!
努力!做一個NB的Coder!
在上篇文章中,我們對Java中的枚舉類進行了詳細的介紹。
對于Enum還不了解的小伙伴,可以先預習《Java中的枚舉類型(Enum)詳解》一文。
通過反編譯,我們知道Java枚舉類會在編譯之后轉化為一個繼承了java
.lang.Enum的類,而我們定義的每個枚舉值都會在類的初始化階段被實例化為我們所定義的枚舉類的一個對象。
在枚舉類被編譯之后,有一些方法是編譯器在編譯階段寫入的,那這些方法有什么特點?枚舉類中還有一些繼承來的方法,它們又有哪些?枚舉類中的枚舉值是在編譯階段被創(chuàng)建為對象,那構造函數(shù)又在哪?
這篇文章我們將詳細分析。
1 Enum抽象類常見方法
我們上篇文章已經(jīng)講過,枚舉類實際上繼承了Enum抽象類,因此Enum抽象類是所有枚舉類型的基本類,下面是它的常見方法:
- ordinal()方法:該方法獲取的是枚舉變量在枚舉類中聲明的順序,下標從0開始,如日期中的MONDAY在第一個位置,那么MONDAY的ordinal值就是0,如果MONDAY的聲明位置發(fā)生變化,那么ordinal方法獲取到的值也隨之變化,注意在大多數(shù)情況下我們都不應該首先使用該方法,畢竟它總是變幻莫測的。
- compareTo(E o)方法:則是比較枚舉的大小,注意其內(nèi)部實現(xiàn)是根據(jù)每個枚舉的ordinal值大小進行比較的。
- name()方法與toString():幾乎是等同的,都是輸出變量的字符串形式。
- getDeclaringClass(): 返回該枚舉變量所在的枚舉類。
需要再次說明的是,以上的方法都是Enum抽象類的方法,會被Enum的對象繼承,而不是Enum的靜態(tài)方法。而最終枚舉值被實例化成了Enum對象,所以,枚舉值擁有以上的方法。
這一塊比較簡單,我們直接舉例子說明:
首先我們定義一個最簡單的枚舉類:
之后我們在定義一個附帶屬性的枚舉類:
接下來,我們寫方法進行試驗:
最后結果:
我們可以看到,對于每個枚舉值,可以調(diào)用上述的繼承自Enum抽象類的方法。
2 枚舉類型的構造函數(shù)
既然枚舉值是由編譯器創(chuàng)建為枚舉類型的實例,那它必然調(diào)用了構造函數(shù)。那該函數(shù)在哪呢?我們能不能調(diào)用呢?
其實該構造函數(shù)也在Enum抽象類中。
我們特意將方法注釋也保留了下來,可以看到,該方法只能由編譯器調(diào)用,開發(fā)人員無法調(diào)用。所以說,我們還是不要操心了,只需要定義好枚舉類型,剩下的交給編譯器。
3 再論編譯器插入的靜態(tài)方法
我們知道values()方法和valueOf(String s)方法是由編譯器插入到枚舉類中的靜態(tài)方法。這總讓人覺得怪異。而同時,我們知道枚舉類型中的每一個枚舉值也在編譯階段被聲明為了一個枚舉類。關于這幾點,我們在上一篇文章中已經(jīng)詳細分析,大家可以回上篇文章找回記憶。我們直接貼出通過字節(jié)碼推出的代碼,如下:
有人會這么認為:
- 原來的Season枚舉類中被編譯器插入了values()方法和valueOf(String s)方法,因此能夠正常調(diào)用Season.values()
- 如果我們使用某個枚舉值,如Season.AUTUMN向上轉型成為Season枚舉類,則無法調(diào)用values()方法和valueOf(String s)方法
其實這是不對的,因為無論是原生的Season枚舉類還是Season.AUTUMN向上轉型成的Season枚舉類,本質(zhì)上是同一個枚舉類。因此,都應該可以調(diào)用values()方法和valueOf(String s)方法。
對此,我們進行驗證:
得到如下輸出:
證明了筆者的猜測。
4 總結
通過該文章,我們對枚舉類中的方法進行了全面的了解:
- 枚舉類在編譯階段會被編譯器插入一些靜態(tài)方法
- 枚舉類本身有個只有編譯器能夠調(diào)用的構造方法,編譯器會使用該方法將枚舉值實例化為枚舉類型的對象
- 枚舉值被實例化后,繼承了眾多java.lang.Enum中的方法
這樣,通過《Java中的枚舉類型(Enum)詳解》和本篇文章,我們對枚舉類型的原理和方法有了詳細的了解。接下來,我們還會有一篇文章介紹枚舉類型的使用,從而從原理、特性、使用三個方面對枚舉類型進行詳細的介紹,歡迎繼續(xù)關注。
—END—
建議:原創(chuàng)分享不易,請 贊同 后再收藏!
分享讓你從程序員進階架構師的原創(chuàng)干貨!
歡迎關注我,不錯過每期的原創(chuàng)干貨!
總結
以上是生活随笔為你收集整理的0编译器详解_详解Java枚举类型(Enum)中的方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 客制化键盘编程_客制化键盘如何入坑?
- 下一篇: matlab计算频域动态性能指标,基于M