【Java|第二十篇】面向對象(十)——枚舉類

目錄

(四)面向對象:

12、枚舉類:

(1)概述:

(2)枚舉類的定義格式:

(3)編譯與反編譯:

(4)Enum類的特點:

(5)枚舉類的測試類以及一些特有的方法:


(四)面向對象:

12、枚舉類:
(1)概述:

?為什么要有枚舉類:

1、類型安全,String類的color傳入“1”也不會報錯,但其實無意義;而enum是強類型,只能使用預定義的值。

2、語意清晰,代碼可讀性高

3、限定取值范圍,避免非法值。? ?

????定義:是一種特殊得類,通過enum關鍵字定義。

(2)枚舉類的定義格式:
[修飾符] enum 枚舉類名 {
?????????????????枚舉元素1,枚舉元素2,...枚舉元素n;
? ? ? ? 枚舉元素必須寫在第一行,如果有多個的話,用逗號','隔開,最后用分號';'結束 ,如果';'后面沒有其他內容的話,';'可以省略,但不建議省略

????????

? ? ? ? 枚舉元素和枚舉元素()效果一樣,含義為:執行枚舉類默認構造器去實例化枚舉元素對象

Gender g1 = Gender.Male;
//Male() : Male = new Gender();

? ? ? ? 枚舉元素本質上是枚舉類對象,由static與final修飾。

? ? ? ? ? ? ? ? [修飾符] 數據類型 數據成員名;

? ? ? ? ? ? ? ??[修飾符] 數據類型 數據成員方法(){……}

枚舉類可以由普通數據成員(方法與屬性)

? ? ? ? ? ? ? ? private 構造方法();

? ? ? ? ? ? ? ? private 構造方法(參數){……}

構造方法必須私有化

不自定義是,系統提供無參構造

枚舉元素那里如果調用,必須定義

? ? ? ? ? ? ? ?[修飾符] static 返回值 成員方法名(){……}

????????????????[修飾符] static 返回值 成員屬性名;

枚舉類中可以由靜態方法與屬性

}

以上是沒有抽象方法的枚舉類的定義格式,從上也可以看出,枚舉類中可以由普通成員,構造方法,靜態成員。

下面我們展示案例:

//枚舉類基本定義
enum Week {//枚舉元素必須寫在第一行,如果有多個的話,用逗號','隔開,//最后用分號';'結束//如果';'后面沒有其他內容的話,';'可以省略,但不建議省略MON, TUE, WED; //WED()//WED和WED()效果一樣,含義為:執行枚舉類默認構造器去實例化枚舉元素對象//源代碼類似:public static final Week WED = new Week();//注意:用戶沒有提供構造器,系統會提供默認的構造器 private Week(){}//枚舉類數據成員和成員方法,可以包含一個或多個private String desc;public String getDesc() {return desc;}public void setDesc(String desc) {this.desc = desc;}//枚舉類構造方法,如果不提供,系統會提供默認構造方法,private修飾//如果用戶自定義枚舉類構造方法,則系統不再提供private Week2() {}//自定義枚舉方法,注意必須用private修飾private Week2(String desc) {this.desc = desc;}
}

接下來是含有抽象方法的枚舉類的定義:

[修飾符]? enum 枚舉類名{

? ? ? ? 枚舉元素1(根據構造方法傳實參){

? ? ? ? ? ? ? ? 重寫該類所有的抽象方法;

????????},枚舉元素2(根據構造方法傳實參){

? ? ? ? ? ? ? ? 重寫該類所有的抽象方法;

????????},……枚舉元素n(根據構造方法傳實參){

? ? ? ? ? ? ? ? 重寫該類所有的抽象方法;

????????};

理解:當我們定義了一個抽象方法,一般是有子類繼承后重寫,然后利用多態調用,但是我們的enum類是final修飾的類,無法被子類繼承,那如何來重寫抽象方法,這里我們想到了匿名內部類,我們可以在創建對象時通過匿名內部類來重寫抽象方法,那我們又想到了枚舉類的特殊性,創建的對象只能取預定義好的枚舉元素那不能再創建對象時寫匿名內部類,我們就只能在枚舉類中創建枚舉元素時,為枚舉元素寫匿名內部類。(枚舉類可以理解為在類內部預定義對象,類外創建的對象只能等于這些預定義對象,那可以理解為實際上枚舉元素就是對象。)

抽象方法不能私有,且每個枚舉元素都必須重寫所有的抽象方法。

? ? ? ? 抽象方法聲明;

}

案例展示:

enum Week3 {//注意:包含抽象方法的枚舉類是抽象類,不能直接實例化對象//所以定義枚舉類元素(所有)時候,一定要重寫抽象方法//注意:必須在所有的枚舉元素定義中,重寫所有抽象方法//MON {MON() {//在枚舉元素中重寫抽象方法@Overridepublic void show() {System.out.println("in show, MON: 周一");}}, TUE("星期二") {//注意,每個枚舉元素中都要重寫重寫方法,且要重寫所有的抽象方法@Overridepublic void show() {System.out.println("in show, TUE: " +this.getDesc());}};//枚舉類數據成員及get方法private String desc;public String getDesc() {return desc;}//枚舉類自定義構造方法private Week3() {}private Week3(String desc) {this.desc = desc;}                                                                //枚舉類 包含的 抽象方法(可以0或多個)public abstract void show();
}
(3)編譯與反編譯:

我們編寫的enum類是不完整的,有很代碼或者修飾符都被省略掉了

我們可以通過反編譯去查看源碼:

javap? enum類的字節碼文件

但是這樣獲得的源碼是隱藏了私有屬性與方法的,如果想查看,則需要使用命令

javap -p enum類的字節碼文件

從這里我們也可以看出來:

枚舉類Gender本質上是一個final修飾的類,不可以被繼承

枚舉類會默認繼承 java.lang.Enum 這個抽象泛型類

枚舉元素,本質上是枚舉類對象,且由 static和final 修飾

枚舉類提供私有構造器,我們在類外不能主動創建枚舉類對象

枚舉類中可以包含 public static 靜態方法

注意:包含抽象方法的enum類,不會被final修飾

(4)Enum類的特點:

<1>類由final修飾,不能被繼承,但是final會隱身,反編譯即可看到,包含抽象方法的enum類,不會被final修飾。

<2>枚舉元素由final與static修飾,唯一且不能被修改,由類名直接調用

<3>枚舉類設有非私有構造器,外界不能通過new創建對象

<4>可以包含靜態方法

(5)枚舉類的測試類以及一些特有的方法:

<1>對象的賦值只能是枚舉元素:Gender g1 = Gender.MALE;

<2>輸出枚舉對象,默認輸出枚舉元素

<3>獲取枚舉元素名字的方法:g.name();

<4>獲取枚舉元素編號:g.ordinal();(返回int型);

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/95889.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/95889.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/95889.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

第二十一天-OLED顯示實驗

一、OLED顯示原理1、OLED名詞解釋OLED可以自發光&#xff0c;無需背光光源。2、正點原子OLED模塊模塊總體概述模塊接口模式選擇MCU與模塊外部連接8080并口讀寫過程OLED顯存因為要進行顯示&#xff0c;所以需要有顯存。顯存容量為128 x 8 byte&#xff0c;一個點用一位表示。SSD…

會議系統核心流程詳解:創建、加入與消息交互

一、系統架構概覽 會議系統采用"主進程線程池進程池"的分層架構&#xff0c;實現高并發與業務隔離&#xff1a; #mermaid-svg-fDJ5Ja5L3rqPkby0 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-fDJ5Ja5L3r…

Spring 創建 Bean 的 8 種主要方式

Spring&#xff08;尤其是 Spring Boot&#xff09;提供了多種方式來讓容器創建和管理 Bean。Component、Configuration Bean、EnableConfigurationProperties 都是常見方式。 下面我為你系統地梳理 Spring 創建 Bean 的所有主要方式&#xff0c;并說明它們的使用場景和區別。…

React 第七十節 Router中matchRoutes的使用詳解及注意事項

前言 matchRoutes 是 React Router v6 提供的一個核心工具函數&#xff0c;主要用于匹配路由配置與當前路徑。它在服務端渲染&#xff08;SSR&#xff09;、數據預加載、權限校驗等場景中非常實用。下面詳細解析其用法、注意事項和案例分析&#xff1a; 1、基本用法 import { m…

iSCSI服務配置全指南(含服務器與客戶端)

iSCSI服務配置全指南&#xff08;含服務器與客戶端&#xff09;一、iSCSI簡介 1. 概念 互聯網小型計算機系統接口&#xff08;Internet Small Computer System Interface&#xff0c;簡稱iSCSI&#xff09;是一種基于TCP/IP的協議&#xff0c;其核心功能是通過IP網絡仿真SCSI高…

堆(Heap):高效的優先級隊列實現

什么是堆&#xff1f;堆是一種特殊的完全二叉樹&#xff0c;滿足以下性質&#xff1a;堆序性&#xff1a;每個節點的值與其子節點滿足特定關系最小堆&#xff1a;父節點 ≤ 子節點&#xff08;根最小&#xff09;最大堆&#xff1a;父節點 ≥ 子節點&#xff08;根最大&#xf…

朝花夕拾(四) --------python中的os庫全指南

目錄 Python os模塊完全指南&#xff1a;從基礎到高階文件操作 1. 引言&#xff1a;為什么需要os模塊&#xff1f; 1.1 os模塊的重要性 1.2 適用場景 1.3 os模塊的"瑞士軍刀"特性 2. os模塊基礎功能 2.1 文件與目錄操作 2.1.1 核心方法介紹 2.1.2 避坑指南 …

uniappx 安卓端本地打包的一些總結

本人之前沒用過android studio&#xff0c;因為有打包到安卓端的需求&#xff0c;所以有了這篇文章。下面一些內容不正常工作&#xff0c;也不報錯&#xff0c;是很煩的&#xff0c;根本不知道是哪里出了問題。比如對應的aar包沒有引入。或者沒有注冊信息。 在實現過程中我遇到…

AUTOSAR進階圖解==>AUTOSAR_SWS_UDPNetworkManagement

AUTOSAR UDP網絡管理詳解 基于AUTOSAR標準的UDP網絡管理模塊架構分析與實現指南目錄 1. 概述2. UDP網絡管理架構 2.1 整體架構圖2.2 架構組件詳解 3. UDP網絡管理狀態機 3.1 狀態機圖3.2 狀態詳解 4. UDP網絡管理操作序列 4.1 序列圖4.2 操作流程詳解 5. UDP網絡管理配置模型 …

AI搜索引擎下的內容優化新范式:GEO的關鍵技術解析

摘要&#xff1a; 生成式AI搜索引擎的崛起&#xff0c;催生了GEO&#xff08;Generative Engine Optimization&#xff09;這一新的優化領域。本文將深入剖析GEO背后的關鍵技術&#xff0c;包括深度語義理解、結構化內容生成、以及AI算法的適配性&#xff0c;旨在為品牌在AI時代…

Java Lambda表達式是什么,怎么用

這種代碼是什么&#xff0c;怎么閱讀/*** 批量插入** param entityList ignore* param batchSize ignore* return ignore*/Transactional(rollbackFor Exception.class)Overridepublic boolean saveBatch(Collection<T> entityList, int batchSize) {String sqlStateme…

集成運算放大器(反向加法,減法)

反向加法電路原理&#xff1a;示波器顯示&#xff1a;結論&#xff1a;輸出電壓-&#xff08;R4/R1*V1R4/R2*V2R4/R3*V3&#xff09;。平衡電阻R4等于R1和R2和R3的并聯電壓。減法運算電路原理&#xff1a;結論&#xff1a;減法運算電路分為三種不同情況&#xff0c;第一種情況為…

Maven入門到精通

目錄 一&#xff0c;Maven概述 1.1介紹 1.2安裝 1.3Maven生命周期和插件 1.4Maven的坐標的本地倉庫的存儲地址 二&#xff0c;依賴管理 2.1依賴管理——依賴范圍 2.2依賴管理——添加依賴 獲取依賴坐標 依賴添加后的操作 2.3依賴管理——依賴傳遞 2.4依賴管理——依…

計算機網絡 TCP 延遲確認機制

TCP 延遲確認&#xff08;Delayed Acknowledgments&#xff0c;簡稱 Delayed ACK&#xff09;是 TCP 協議中一項旨在減少網絡中小數據包數量、提升傳輸效率的優化機制。其核心思想是&#xff1a;不立即回復 ACK&#xff0c;而是等待一段時間&#xff08;通常 40ms&#xff09;&…

【visual studio】visual studio配置環境opencv和onnxruntime

下載opencv https://opencv.org/releases/?spma2ty_o01.29997173.0.0.57f4c921RELipW配置環境變量visual studio配置opencv 新建c項目選中文件后右鍵選擇屬性添加include文件夾庫文件添加lib添加lib文件 將上一步的lib文件夾下的兩個文件復制到這里以下兩者區別在于&#xff0…

【Java】多線程Thread類

1. 進程與線程進程與線程的基本認識進程&#xff08;Process&#xff09;&#xff1a;進程是程序的一次動態執行過程&#xff0c;它經歷了從代碼加載、執行、到執行完畢的一個完整過程&#xff1b;同時也是并發執行的程序在執行過程中分配和管理資源的基本單位&#xff0c;競爭…

C/C++復習(四)

一.模版 模版涉及的是泛型編程&#xff0c;即通過編譯器去確定類型的編程方式&#xff0c;模版分為&#xff1a;類模板和函數模版&#xff0c;下面我們一一復習&#xff1a; 函數模版&#xff1a; 格式&#xff1a; template<typename T1, typename T2,......,typename Tn&g…

022 基礎 IO —— 文件

&#x1f984; 個人主頁: 小米里的大麥-CSDN博客 &#x1f38f; 所屬專欄: Linux_小米里的大麥的博客-CSDN博客 &#x1f381; GitHub主頁: 小米里的大麥的 GitHub ?? 操作環境: Visual Studio 2022 文章目錄基礎 IO —— C 語言文件 I/O 操作基礎前言1. C 語言文件操作函數匯…

MNN LLM Chat iOS 流式輸出優化實踐

本文介紹了在 iOS 平臺上使用 MNN 框架部署大語言模型&#xff08;LLM&#xff09;時&#xff0c;針對聊天應用中文字流式輸出卡頓問題的優化實踐。通過分析模型輸出與 UI 更新不匹配、頻繁刷新導致性能瓶頸以及缺乏視覺動畫等問題&#xff0c;作者提出了一套包含智能流緩沖、U…

【開發技巧】VS2022+QT5+OpenCV4.10開發環境搭建QT Creator

VS2022編譯器支持配置 QT5默認安裝以后支持的是VS2015與VS2017&#xff0c;不支持VS2022&#xff0c;所以必須首先在Qt Creator中配置支持VS2022。配置順序如下&#xff1a; 首先打開【工具】->【選項】 然點擊Kits里面的【編譯器】選項。點擊Manual下面的【C】然后點擊【…