Java的枚舉,注解和反射(一)
枚舉
什么是枚舉?
枚舉的字面意思就是 一一列舉出來(lái)
在數(shù)學(xué)和計(jì)算機(jī)科學(xué)理論中,一個(gè)集的枚舉是列出某些有窮序列集的所有成員的程序,或者是一種特定類型對(duì)象的計(jì)數(shù)。這兩種類型經(jīng)常(但不總是)重疊。是一個(gè)被命名的整型常數(shù)的集合,枚舉在日常生活中很常見,例如表示星期的SUNDAY、MONDAY、TUESDAY、WEDNESDAY、THURSDAY、FRIDAY、SATURDAY
就是一個(gè)枚舉。再比如線程的狀態(tài):創(chuàng)建、運(yùn)行、阻塞、等待、消亡,這也是一個(gè)枚舉。
在java中的枚舉也是類似的:
枚舉是在JDK1.5以后引入的。主要用途是:將一組常量組織起來(lái)。
當(dāng)需要定義一組常量的時(shí)候就可以使用枚舉。枚舉的對(duì)象是有限的、確定的。
枚舉本身就是一個(gè)類,其構(gòu)造方法默認(rèn)為私有的。
如果枚舉類的對(duì)象只有一個(gè),則可以作為單例模式的一種實(shí)現(xiàn)方式。
枚舉類的實(shí)現(xiàn)
自定義實(shí)現(xiàn)枚舉類
jdk1.5之前使用自定義的方式實(shí)現(xiàn)枚舉類的定義
package enumDemo; /** * user:ypc; * date:2021-06-22; * time: 18:21; * 自定義實(shí)現(xiàn)枚舉類 */ public class EnumDemo1 { public static void main(String[] args) { Season spring = Season.SPRING; System.out.println(spring); } } //自定義實(shí)現(xiàn)季節(jié)的枚舉類 class Season { //1.首先要求枚舉類是常量,就可以使用 private final 來(lái)修飾 private final String seasonName; private final String seasonDesc; //2.常量肯定要賦值,提供私有的構(gòu)造方法來(lái)初始化常量 private Season(String seasonName, String seasonDesc) { this.seasonName = seasonName; this.seasonDesc = seasonDesc; } //3.枚舉的對(duì)象是有限個(gè)的,確定的。所以要提供對(duì)應(yīng)的枚舉對(duì)象 public static final Season SPRING = new Season("春天", "春暖花開"); public static final Season SUMMER = new Season("夏天", "夏日炎炎"); public static final Season AUTUMN = new Season("秋天", "秋高氣爽"); public static final Season WINTER = new Season("冬天", "冰天雪地"); //提供獲取枚舉的屬性的方法 public String getSeasonName() { return seasonName; } public String getSeasonDesc() { return seasonDesc; } @Override public String toString() { return "Season{" + "seasonName='" + seasonName + '\'' + ", seasonDesc='" + seasonDesc + '\'' + '}'; } }
使用關(guān)鍵字enum定義枚舉類
jdk1.5引入enum關(guān)鍵字
package enumDemo; import org.junit.Test; /** * user:ypc; * date:2021-06-22; * time: 18:40; * 使用enum關(guān)鍵字來(lái)定義枚舉類 */ public class EnumDemo2 { @Test public void test(){ SeasonEnum spring = SeasonEnum.SPRING; System.out.println(spring); //枚舉類的父類是 System.out.println("枚舉類的父類是:"+SeasonEnum.class.getSuperclass().getName()); } } enum SeasonEnum{ //提供當(dāng)前枚舉類的對(duì)象,之間使用","隔開,最后一個(gè)對(duì)象使用";"隔開 SPRING("春天","春暖花開"), SUMMER("夏天","夏日炎炎"), AUTUMN("秋天","秋高氣爽"), WINTER("冬天","冰天雪地"); private final String seasonName; private final String seasonDesc; private SeasonEnum(String seasonName,String seasonDesc){ this.seasonName = seasonName; this.seasonDesc = seasonDesc; } }
Enum的常用方法
package enumDemo; import org.junit.Test; /** * @author ypc * @create 2021-06-22; * 枚舉類常用的方法 */ public class EnumDemo3 { @Test public void test() { //toString方法 System.out.println(SeasonEnum.SPRING.toString()); System.out.println("****************************"); //values方法. SeasonEnum[] seasonEnums = SeasonEnum.values(); System.out.println("季節(jié)枚舉類中的對(duì)象:"); for (SeasonEnum seasonenum : seasonEnums) { System.out.println(seasonenum); } System.out.println("****************************"); //線程狀態(tài)中的所有的枚舉的對(duì)象 Thread.State[] states = Thread.State.values(); System.out.println("線程狀態(tài)枚舉類中的對(duì)象:"); for (int i = 0; i < states.length; i++) { System.out.println(states[i]); } System.out.println("****************************"); //valueOf方法 SeasonEnum winter = SeasonEnum.valueOf("WINTER"); System.out.println(winter); } }
實(shí)現(xiàn)接口的枚舉類
實(shí)現(xiàn)接口,在枚舉類中實(shí)現(xiàn)抽象方法
interface info { void show(); } enum SeasonEnumImplementsInterface1 implements info { //提供當(dāng)前枚舉類的對(duì)象,之間使用","隔開,最后一個(gè)對(duì)象使用";"隔開 SPRING("春天", "春暖花開"), SUMMER("夏天", "夏日炎炎"), AUTUMN("秋天", "秋高氣爽"), WINTER("冬天", "冰天雪地"); private final String seasonName; private final String seasonDesc; private SeasonEnumImplementsInterface1(String seasonName, String seasonDesc) { this.seasonName = seasonName; this.seasonDesc = seasonDesc; } @Override public void show() { System.out.println("枚舉類實(shí)現(xiàn)了接口的抽象方法"); } }
讓接口的每個(gè)枚舉對(duì)象都實(shí)現(xiàn)各自的方法
//枚舉的各個(gè)對(duì)象實(shí)現(xiàn)了接口的抽象方法 enum SeasonEnumImplementsInterface2 implements info { //提供當(dāng)前枚舉類的對(duì)象,之間使用","隔開,最后一個(gè)對(duì)象使用";"隔開 SPRING("春天", "春暖花開") { @Override public void show() { System.out.println("春天來(lái)了"); } }, SUMMER("夏天", "夏日炎炎") { @Override public void show() { System.out.println("夏天到了"); } }, AUTUMN("秋天", "秋高氣爽") { @Override public void show() { System.out.println("秋天來(lái)了"); } }, WINTER("冬天", "冰天雪地") { @Override public void show() { System.out.println("冬天來(lái)了"); } }; private final String seasonName; private final String seasonDesc; private SeasonEnumImplementsInterface2(String seasonName, String seasonDesc) { this.seasonName = seasonName; this.seasonDesc = seasonDesc; } }
public class EnumDemo4 { @Test public void test1(){ SeasonEnumImplementsInterface1[] SeasonEnumImplementsInterface1s = SeasonEnumImplementsInterface1.values(); System.out.println("季節(jié)枚舉類中的對(duì)象:"); for (SeasonEnumImplementsInterface1 seasonEnumImplementsInterface1:SeasonEnumImplementsInterface1s) { System.out.println(seasonEnumImplementsInterface1); seasonEnumImplementsInterface1.show(); } } @Test public void test2(){ SeasonEnumImplementsInterface2[] SeasonEnumImplementsInterface2s = SeasonEnumImplementsInterface2.values(); System.out.println("季節(jié)枚舉類中的對(duì)象:"); for (SeasonEnumImplementsInterface2 seasonEnumImplementsInterface2:SeasonEnumImplementsInterface2s) { System.out.println(seasonEnumImplementsInterface2); seasonEnumImplementsInterface2.show(); } } }
注解
注解概述
在Java中,注解(Annotation
)引入始于Java5,用來(lái)描述Java代碼的元信息,通常情況下注解不會(huì)直接影響代碼的執(zhí)行,盡管有些注解可以用來(lái)做到影響代碼執(zhí)行。
A
nnotation
其實(shí)就是代碼里的特殊標(biāo)記, 這些標(biāo)記可以在編譯, 類加載, 運(yùn)行時(shí)被讀取, 并執(zhí)行相應(yīng)的處理。通過(guò)使用 Annotation,程序員可以在不改變?cè)壿嫷那闆r下, 在源文件中嵌入一些補(bǔ)充信息。
Annotation可以像修飾符一樣使用,可以用來(lái)修飾包、類、構(gòu)造器、方法、成員變量、參數(shù)、局部變量的聲明,這些信息被保存在Annotation的“name = value”對(duì)中。
在JavaSE中,注解的使用目的比較簡(jiǎn)單,例如標(biāo)記過(guò)時(shí)的功能,忽略警告等。
一定的程度上可以說(shuō)框架 = 注解 + 反射機(jī)制 + 設(shè)計(jì)模式
常見的注解
1.生成文檔相關(guān)的注解
2.在編譯的時(shí)候進(jìn)行格式的檢查
3.跟蹤代碼的依賴性,實(shí)現(xiàn)代替配置文件的功能
package AnnotationDemo; /** * 1.生成文檔相關(guān)的注解 * @author ypc * @create 2021-06-22; */ public class AnnotationDemo1 { } class B implements A{ //2.在編譯的時(shí)候進(jìn)行格式的檢查 @Override public void test() { } } interface A{ void test(); } /** * 3.跟蹤代碼的依賴性,實(shí)現(xiàn)代替配置文件的功能 * 未使用注解的時(shí)候 <servlet> <servlet-name>reg</servlet-name> <servlet-class>service.RegServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>reg</servlet-name> <url-pattern>/reg</url-pattern> </servlet-mapping> 使用注解之后: @WebServlet("/reg") */
總結(jié)
本篇文章的上半部分就到這里了,希望對(duì)你有所幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
SpringBoot如何通過(guò)自定義注解實(shí)現(xiàn)權(quán)限檢查詳解
這篇文章主要給大家介紹了關(guān)于SpringBoot如何通過(guò)自定義注解實(shí)現(xiàn)權(quán)限檢查的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10Javaweb開發(fā)中通過(guò)Servlet生成驗(yàn)證碼圖片
這篇文章主要為大家詳細(xì)介紹了Javaweb開發(fā)中通過(guò)Servlet生成驗(yàn)證碼圖片的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-05-05Java中PageHelper分頁(yè)后對(duì)list操作導(dǎo)致分頁(yè)無(wú)效
在項(xiàng)目中使用分頁(yè)插件的時(shí)候發(fā)現(xiàn)PageHelper插件失效了,本文就來(lái)介紹一下Java中PageHelper分頁(yè)后對(duì)list操作導(dǎo)致分頁(yè)無(wú)效的解決方法,感興趣的可以了解一下2021-05-05AbstractQueuedSynchronizer(AQS)鎖狀態(tài)同步和排隊(duì)管理
這篇文章主要介紹了為大家AbstractQueuedSynchronizer(AQS)鎖狀態(tài)同步和排隊(duì)管理源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11java.lang.NoClassDefFoundError錯(cuò)誤的原因及解決方法
這篇文章主要給大家介紹了關(guān)于java.lang.NoClassDefFoundError錯(cuò)誤的原因及解決的相關(guān)資料,java.lang.NoClassDefFoundError是Java虛擬機(jī)在運(yùn)行時(shí)無(wú)法找到特定類的錯(cuò)誤,需要的朋友可以參考下2023-10-10關(guān)于JAVA11中圖片與BASE64相互轉(zhuǎn)換的實(shí)現(xiàn)
這篇文章主要介紹了關(guān)于JAVA11中圖片與BASE64相互轉(zhuǎn)換的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04Java無(wú)界阻塞隊(duì)列DelayQueue詳細(xì)解析
這篇文章主要介紹了Java無(wú)界阻塞隊(duì)列DelayQueue詳細(xì)解析,DelayQueue是一個(gè)支持時(shí)延獲取元素的無(wú)界阻塞隊(duì)列,隊(duì)列使用PriorityQueue來(lái)實(shí)現(xiàn),隊(duì)列中的元素必須實(shí)現(xiàn)Delayed接口,在創(chuàng)建元素時(shí)可以指定多久才能從隊(duì)列中獲取當(dāng)前元素,需要的朋友可以參考下2023-12-12