Java基礎之枚舉Enum類案例詳解
一、文章序言
Java中引用類型:數(shù)組、類、接口、枚舉、注解
枚舉這個既熟悉又陌生的東西具體再哪里可以使用呢?
什么是枚舉?
枚舉是一個引用類型,枚舉就是一個規(guī)定了取值范圍的變量類型。
枚舉變量不能使用其他的數(shù)據(jù),只能使用枚舉中常量賦值。提高程序安全性;
//格式: public enum 枚舉名{ //枚舉的取值范圍 //枚舉中可以生命方法 }
枚舉的使用場景介紹?
1、最常見的情況如星期,相關變量我們會在Java里面重復使用,在這里我們就可以來定義一個叫做“星期”的枚舉。
public enum Day { SUNDAY, MONDAY, TUESDAY, WEDNESDAY,THURSDAY, FRIDAY, SATURDAY }
如果不定義成枚舉,各位的寫法就千奇百怪了,比如“周一”、“星期一”、“Monday”等,寫法千奇百怪,定義枚舉一目了然。
2、比如說季節(jié)的春夏秋冬,我們同樣可以定義一個這樣的變量來存儲對應的季節(jié)。
public enum Season { SPRING, SUMMER, AUTUMN, WINTER; }
3、英雄聯(lián)盟里面,有很多職業(yè),比如說”戰(zhàn)士“、”法師“、”射手“……等職業(yè)。我們就可以定義一個叫”職業(yè)“的枚舉類型;后臺再其它地方哪里需要直接引用即可;
總結(jié):枚舉里面定義的就相當于是已經(jīng)生成且固定的對象,你可以直接使用;如果Java代碼里面與如上需要定義的常量可以直接定義一個枚舉類;
定義枚舉類型時本質(zhì)上就是定義一個類別,只不過很多細節(jié)由編譯器幫我們完成了,所以某些程度上,enum關鍵字的作用 就像是class或interface
1 枚舉的本質(zhì):其實就是終止類,并繼承Enum抽象類。
2 枚舉中的變量,其實就是一個當前類型的靜態(tài)常量。
解釋:
當我們使用“enum”定義枚舉類型時,實質(zhì)上我們定義出來的類型繼承自java.lang.Enum類型,而枚舉的成員其實就是我們定義的枚舉類型的一 個實例(Instance),他們都被預設為final,所以我們無法改變他們,他們也是static成員,所以我們可以通過類型名稱直接使用他們,當然最重要的,他們都是公開的(public)。
二、代碼實踐
先定義一個枚舉:季節(jié)枚舉
//聲明一個表示季節(jié)的枚舉 public enum Season { SPRING, SUMMER, AUTUMN, WINTER; }
枚舉可以搭配switch語句使用:案例如下
public class TestSeasonEnum { public static void main(String[] args) { Season season = Season.SPRING; //switch小括號中的表達式類型可以是枚舉類型 switch(season){ //每個case后的常量直接寫枚舉的取值范 case SPRING: System.out.println("春天"); break; case SUMMER: System.out.println("夏天"); break; case AUTUMN: System.out.println("秋天"); break; case WINTER: System.out.println("冬天"); break; } } }
輸出結(jié)果
春天
為了加深理解,再舉例一個錯誤的用法
An enum switch case label must be the unqualified name of an enumeration constant
注意,在switch中,不能使用枚舉類名稱,因為編譯器會根據(jù)switch()的類型來判定每個枚舉類型,在case中必須直接給出與()相同類型的枚舉選項,而不能再有類型。
代碼如上可以直接測試,建議實測
三、面試相關
來來來,剛好抽時間一起整理一下常見面試問題吧,然后相關解析已經(jīng)附上詳細代碼學習,實踐實踐再實踐!
1.枚舉允許繼承類嗎?
枚舉類使用enum定義后在編譯后默認繼承了java.lang.Enum類,而不是普通的繼承Object類。enum聲明類繼承了Serializable和Comparable兩個接口。且采用enum聲明后,該類會被編譯器加上final聲明(同String),故該類是無法繼承的。
所有枚舉類都默認是Enum類的子類,無需我們使用extends來繼承。
2.枚舉允許實現(xiàn)接口嗎?
枚舉允許實現(xiàn)接口。因為枚舉本身就是一個類,類是可以實現(xiàn)多個接口的。
public interface EnumInterface { public abstract void print(); }
public enum SizeEnum implements EnumInterface{ BIG,MIDDLE,SMALL; @Override public void print() { System.out.println("繼承接口-重寫方法一次"); } }
3.枚舉可以用等號比較嗎?
肯定,因為在Enum類里面,已經(jīng)重寫了equals方法,而方法里面比較就是直接使用==,來比較2個對象的。所以,你在外邊直接使用==也是可以的。
4.可以繼承枚舉嗎?
當然不能呀,枚舉類默認繼承了java.lang.Enum類,一個類怎么能繼承兩個類呢?
5.枚舉可以實現(xiàn)單例模式嗎?
枚舉本身就是一種對單例設計模式友好的形式,它是實現(xiàn)單例模式的一種很好的方式。
public class InstanceDemo { /** * 構(gòu)造方法私有化 */ private InstanceDemo(){ } /** * 返回實例 * @return */ public static InstanceDemo getInstance() { return Singleton.INSTANCE.getInstance(); } /** * 使用枚舉方法實現(xiàn)單利模式 */ private enum Singleton { INSTANCE; private InstanceDemo instance; /** * JVM保證這個方法絕對只調(diào)用一次 */ Singleton() { instance = new InstanceDemo(); } public InstanceDemo getInstance() { return instance; } } //測試一下 public static void main(String[] args) { InstanceDemo one = InstanceDemo.getInstance(); InstanceDemo two = InstanceDemo.getInstance(); System.out.println(one); System.out.println(two); System.out.println(one == two); } }
創(chuàng)建的對象相同
csdn.test.recursion.demo.InstanceDemo@74a14482 csdn.test.recursion.demo.InstanceDemo@74a14482 true
6.當使用compareTo()比較枚舉時,比較的是什么?
int compareTo(E e):比較兩個枚舉常量誰大誰小,其實比較的就是枚舉常量在枚舉類中聲明的順序;返回值可以仔細看看源碼;
一起看看,底層代碼吧
public final int compareTo(E o) { Enum<?> other = (Enum<?>)o; Enum<E> self = this; if (self.getClass() != other.getClass() && // optimization self.getDeclaringClass() != other.getDeclaringClass()) throw new ClassCastException(); return self.ordinal - other.ordinal; }
舉個例子你就能理解了
public class TestSeasonEnum { public static void main(String[] args) { Season season = Season.SPRING; Season season1 = Season.SUMMER; Season season2 = Season.AUTUMN; Season season3 = Season.WINTER; System.out.println(season.compareTo(season1)); System.out.println(season.compareTo(season2)); System.out.println(season.compareTo(season3)); } }
輸出結(jié)課,詳情參考源碼一看便知道
-1
-2
-3
7. 當使用equals()比較枚舉的時候,比較的是什么?
枚舉類型的equals()方法比較的是枚舉類對象的內(nèi)存地址,作用與等號等價。
到此這篇關于Java基礎之枚舉Enum類案例詳解的文章就介紹到這了,更多相關Java枚舉Enum類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
MyBatis-Plus實現(xiàn)對查詢結(jié)果進行分頁的基本步驟
MyBatis-Plus 是一個 MyBatis 的增強工具,在 MyBatis 的基礎上只做增強不做改變,為簡化開發(fā)、提高效率而生,MyBatis-Plus 支持多種數(shù)據(jù)庫的分頁查詢,其分頁功能是通過 Page 類實現(xiàn)的,本文介紹了使用 MyBatis-Plus 實現(xiàn)分頁查詢的基本步驟,需要的朋友可以參考下2024-08-08Java新特性中Preview功能如何運行調(diào)試詳解
這篇文章主要為大家介紹了Java新特性中Preview功能如何運行調(diào)試詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-10-10Springboot+WebSocket+Netty實現(xiàn)在線聊天/群聊系統(tǒng)
這篇文章主要實現(xiàn)在好友添加、建群、聊天對話、群聊功能,使用Java作為后端語言進行支持,界面友好,開發(fā)簡單,文章中有詳細的代碼示例供大家參考,需要的朋友可以參考下2023-08-08Java操作數(shù)據(jù)庫(行級鎖,for update)
這篇文章主要介紹了Java操作數(shù)據(jù)庫(行級鎖,for update),文章圍繞Java操作數(shù)據(jù)庫的相關資料展開詳細內(nèi)容,需要的小伙伴可以參考一下,希望對你有所幫助2021-12-12使用Mybatis-plus清空表數(shù)據(jù)的操作方法
MyBatis 是一個基于 java 的持久層框架,它內(nèi)部封裝了 jdbc,極大提高了我們的開發(fā)效率,文中給大家介紹了MybatisPlus常用API-增刪改查功能,感興趣的朋友跟隨小編一起看看吧2022-11-11實戰(zhàn)SpringBoot集成JWT實現(xiàn)token驗證
本文詳細講解了SpringBoot集成JWT實現(xiàn)token驗證,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-12-12