一文瞭解java枚舉

来源:https://www.cnblogs.com/xwdzj/p/18221334
-Advertisement-
Play Games

1. 枚舉的由來 當我們知道所有變數的可能性時,儘量使用枚舉類型來定義,比如季節,春夏秋冬,一周(一二三四五六七),只讀不需要修改 有限的一個一個列舉出來的類叫做枚舉類,枚舉是一組常量的集合,枚舉也是一個特殊的類,裡面包含了一組有限的特定對象 2. 自定義實現枚舉 不需要提供set方法,因為枚舉對象 ...


1. 枚舉的由來

當我們知道所有變數的可能性時,儘量使用枚舉類型來定義,比如季節,春夏秋冬,一周(一二三四五六七),只讀不需要修改
有限的一個一個列舉出來的類叫做枚舉類,枚舉是一組常量的集合,枚舉也是一個特殊的類,裡面包含了一組有限的特定對象

2. 自定義實現枚舉

  1. 不需要提供set方法,因為枚舉對象值不能被修改(這裡註意枚舉一般只用於知道所有固定變數的值)
  2. 構造器私有化
  3. 枚舉對象/屬性用" final static""修飾
  4. 根據不同的類,生成不同數量的枚舉對象,而且枚舉對象定義全部大寫

引用前例子

這裡已知季節的所有變數是固定的春夏秋冬,可以用枚舉來寫

package EG.枚舉的由來;

   //設置季節,春夏秋冬  
  
public class Test {  
    public static void main(String[] args) {  
        /*  
         * 秋autumn  
         * 冬winter  
         * */
        Season spring = new Season("春天","暖和");  
        Season summer = new Season("夏天","酷熱");  
        Season autumn = new Season("秋天", "涼爽至極");  
        Season winter = new Season("冬天", "冰冷刺骨");  
        System.out.println(spring);  
  
    }  
}
package EG.枚舉的由來;  
  
/**  
 * @author 簡水君  
 */  
public class Season {  
   /** 季節的名稱*/  
    private  String name;  
   /** 季節的信息*/  
    private  String desc;  
  
  
    //javaBean  
  
    public Season() {  
    }  
    public Season(String name, String desc) {  
        this.name = name;  
        this.desc = desc;  
    }  
  
    public String getName() {  
        return name;  
    }  
  
    public void setName(String name) {  
        this.name = name;  
    }  
  
    public String getDesc() {  
        return desc;  
    }  
  
    public void setDesc(String desc) {  
        this.desc = desc;  
    }  
  
    @Override  
    public String toString() {  
        return   name+"的特點: "+desc;  
    }  
}

引用後例子

package EG.枚舉的由來.引用後;  
  
   //設置季節,春夏秋冬  
  
public class Test {  
    public static void main(String[] args) {  
  
        System.out.println(Season.SPRING);  
        System.out.println(Season.SUMMER);  
        System.out.println(Season.SPRING);  
        System.out.println(Season.WINTER);  
    }  
}

這裡模擬Season類繼承enum類稱為枚舉類,其次是季節都是固定的值,不能再次創建也不能修改,將構造器私有化,把set方法刪除,創建靜態對象

package EG.枚舉的由來.引用後;  
  
/**  
 * @author 簡水君  
 */  
public class Season {  
    /**  
     * 季節的名稱  
     */  
    private String name;  
    /**  
     * 季節的信息  
     */  
    private String desc;  
  
    //javaBean  
  
    /** 這裡模擬Season類繼承enum類稱為枚舉類 */  
  
	public final static Season SPRING = new Season("春天", "暖和");  
	public final static Season SUMMER = new Season("夏天", "酷熱");  
	public final static Season AUTUMN = new Season("秋天", "涼爽至極");  
	public final static Season WINTER = new Season("冬天", "冰冷刺骨");
  
    private Season(String name, String desc) {  
        this.name = name;  
        this.desc = desc;  
    }  
  
    public String getName() {  
        return name;  
    }  
  
    public String getDesc() {  
        return desc;  
    }  
  
    @Override  
    public String toString() {  
        return name + "的特點: " + desc;  
    }  
}

3.枚舉的使用

定義枚舉用名詞enum ,第一行只能是常量(最終靜態/類的對象的縮寫),多個常量用逗號分隔,後面行隨意
格式:

  1. 無參時: 變數名1,變數名2,變數名3; 等價於 變數n()
  2. 有參時; 變數名1(實參),變數名2(實參),變數名3(實參);
package EG.b枚舉的使用;  

/**  
* @author 簡水君  
*/  
 
 
//設置季節,春夏秋冬  
 
public class Test {  
   public static void main(String[] args) {  
 
       System.out.println(Season.SPRING);  
       System.out.println(Season.SUMMER);  
       System.out.println(Season.SPRING);  
       System.out.println(Season.WINTER);  
 
   }  
}  
 
enum Season {  
    //這裡季節都是固定的值把set方法刪除  
/* 這裡 SPRING("春天", "暖和")相當於 public final static Season SPRING = new Season("春天", "暖和");  假設有個無參常量 SPRING,也是等價於SPRING()的*/
   SPRING("春天", "暖和"),SUMMER("夏天", "酷熱"),AUTUMN("秋天", "涼爽至極"),WINTER("冬天", "冰冷刺骨");  
 
   //javaBean  
   /**  
    * 季節的名稱  
    */  
   private String name;  
   /**  
    * 季節的信息  
    */  
   private String desc;  
   private Season(String name, String desc) {  
       this.name = name;  
       this.desc = desc;  
   }  
 
   public String getName() {  
       return name;  
   }  
 
   public String getDesc() {  
       return desc;  
   }  
 
   @Override  
   public String toString() {  
       return name + "的特點: " + desc;  
   }  
}

4.反編譯enum類

這裡 底層將該季節類Season為最終類,不能被繼承且繼承了Enum介面,有其方法values(),valueOf(),還有一個靜態代碼塊

練習題

這裡BOY,GIRL都是創建了無參的常量對象,這裡輸出boy指的是Boy的對象(類載入時載入一次靜態最終常量),但這裡沒有重寫Enum的toString()方法,所以指的是其常量名字,兩個引用指向一個對象

5.枚舉enum的方法

package EG.c枚舉方法的使用;  
  
import java.util.Arrays;  
  
/**  
 * @author 簡水君  
 */  
public class Test {  
    public static void main(String[] args) {  
        Season sp = Season.SPRING;  
        // 1. toString()這裡返回的是枚舉對象的名字 SPRING        System.out.println(sp);  
        // 2. name()這裡返回的也是枚舉對象的名字 SPRING        System.out.println(sp.name());  
        // 3.返回的是枚舉對象的索引位置 0 , 可以用於comparable比較  
        System.out.println(sp.ordinal());  
        // 4. values() 這裡返回的是一個枚舉的所有常量的數組  
        Season[] values = Season.values();  
        System.out.println(Arrays.toString(values));  
        // for( Season s :  values ){}  
  
        // 5. valueOf(" ")獲取包含字元串的常量對象  
        Season sa = Season.valueOf("WINTER");  
        System.out.println(sa);  
  
        // 6.CompareTo: 比較兩個枚舉常量,比較的是編號的差值,底層是兩者調用ordinal方法的差值,這可以算出兩個常量位置的差值  
        //春天和冬天的差值0-3  
        int i = Season.SPRING.compareTo(Season.WINTER);  
        System.out.println(i);  
  
    }  
}  
  
enum Season {  
    SPRING("春天", "暖和"), SUMMER("夏天", "酷熱"), AUTUMN("秋天", "涼爽至極"), WINTER("冬天", "冰冷刺骨");  
    private String name;  
    private String desc;  
  
    private Season() {  
    }  
    private Season(String name, String desc) {  
        this.name = name;  
        this.desc = desc;  
    }  
  
    public String getName() {  
        return name;  
    }  
  
    public String getDesc() {  
        return desc;  
    }  
  
}

例子

package EG.d練習題;  
  
import java.util.Arrays;  
import java.util.PropertyResourceBundle;  
  
/**  
 * @author 簡水君  
 */  
public class Test {  
    public static void main(String[] args) {  
    //獲取所有的常量數組,遍歷  
        Week[] values = Week.values();  
        System.out.println("所有星期信息如下: ");  
        for (Week value : values) {  
            System.out.print(value+" ");  
        }  
    }  
}  
  
/**  
因為我們知道一周所有變數固定的值,所以用枚舉來寫,而且各個變數不給改變,  
 而且定義的Week的是最終類,不給繼承,但可以創建對象  
*/  
enum Week{  
    MONDAY("周一"),TUESDAY("周二"),WEDNESDAY("周三"),THURSDAY("周四"),FRIDAY("周五"),SATURDAY("周六"),SUNDAY("周末");  
  
    private  String name;  
  
  
   private Week() {  
    }  
    private Week(String name) {  
        this.name = name;  
    }  
  
    public String getName() {  
        return name;  
    }  
  
    @Override  
    public String toString() {  
        return name;  
    }  
}

6.枚舉實現介面

  1. 使用enum關鍵字後,就不能再繼承其他類了,但enum定義的類底層會繼承Enum介面,這算是java的單繼承機制了
  2. 枚舉類和普通類一樣,可以實現介面,如下形式 enum 類名 implements 介面1,介面2{} ,多幾個義父
package EG.e枚舉實現介面;  
  
public class Test {  
    public static void main(String[] args) {  
  
    //    調用枚舉的方法  
        Music.GUANGHUISUIYUE.play();  
    }  
}  
  
enum  Music implements Play{  
    //定義一個音樂對象  
    GUANGHUISUIYUE;  
  
    @Override  
    public void play() {  
        //列印常量的名稱  
        System.out.println("正在播放

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、 是什麼 Node作為一門服務端語言,性能方面尤為重要,其衡量指標一般有如下: CPU 記憶體 I/O 網路 CPU 主要分成了兩部分: CPU負載:在某個時間段內,占用以及等待CPU的進程總數 CPU使用率:CPU時間占用狀況,等於 1 - 空閑CPU時間(idle time) / CPU總時間 ...
  • 1️⃣ 原因 由於是一個比較老的項目,所以在做功能時,用到了老項目的一個控制項,這一個控制項是以前封裝好的,依賴的是jquery-1.6.min.js。但是在做下拉框多選功能時,在網上找了一個下拉框多選的框架,但是這個框架依賴是jquery.js(3.7.1),所以才出現了這個問題。 簡單來說就是新老控 ...
  • 1、是什麼 pointer-events 直譯為指針事件,該屬性指定在什麼情況下某個DOM可以成為滑鼠事件的 target。 簡而言之,就是允許/禁止DOM的滑鼠事件(click事件、hover事件、mouse事件等滑鼠事件) 2、具體屬性分析 用法分析:pointer-events: auto | ...
  • 前言 眾所周知,當子組件使用setup後,父組件就不能像vue2那樣直接就可以訪問子組件內的屬性和方法。這個時候就需要在子組件內使用defineExpose巨集函數來指定想要暴露出去的屬性和方法。這篇文章來講講defineExpose巨集函數是如何暴露出去這些屬性和方法給父組件使用。註:本文中使用的vu ...
  • 最近在做滑鼠框選的需求,滑鼠框選就需要用到 Range 和 Selection 對象。 Range 表示選擇的區間範圍,Selection 表示選擇的文檔內容。 Range 介面表示一個包含節點與文本節點的一部分的文檔片段。 不僅僅可以用於滑鼠框選,頁面上任何元素、文本都可以創建 Range。 Se... ...
  • 一、遞歸 遞歸(英語:Recursion) 在數學與電腦科學中,是指在函數的定義中使用函數自身的方法 在函數內部,可以調用其他函數。如果一個函數在內部調用自身本身,這個函數就是遞歸函數 其核心思想是把一個大型複雜的問題層層轉化為一個與原問題相似的規模較小的問題來求解 一般來說,遞歸需要有邊界條件、 ...
  • title: 理解Vue 3響應式系統原理 date: 2024/5/28 15:44:47 updated: 2024/5/28 15:44:47 categories: 前端開發 tags: Vue3.x TypeScript SFC優化 Composition-API Ref&Reactive ...
  • 我們知道,lua通過package模塊來管理模塊的搜索和載入,當使用require首次成功載入一個模塊後,模塊(Table)會被存儲在package.loaded中,之後的require行為會直接獲取到已載入的模塊緩存。 如何在程式執行時,將對模塊文件的修改熱更新到程式中,同時確保運行時狀態的正常。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...