enum 的全稱為 enumeration, 是 JDK 5 中引入的新特性,存放在 java.lang 套件中。這篇文章要跟大家介紹Java枚舉相關知識,需要的朋友參考下
enum 的全稱為 enumeration, 是 JDK 5 中引入的新特性,存放在 java.lang 包中。
原始的介面定義常數
public interface IConstants { String MON = "Mon"; String TUE = "Tue"; String WED = "Wed"; String THU = "Thu"; String FRI = "Fri"; String SAT = "Sat"; String SUN = "Sun"; }
語法(定義)
建立枚舉型別要使用enum 關鍵字,隱含了所建立的型別都是java.lang.Enum 類別的子類別(java.lang.Enum 是抽象類別)。枚舉型別符合通用模式Class Enum
package com.bjpowernode.test; /** * 枚举测试类 */ public enum EnumTest { MON, TUE, WED, THU, FRI, SAT, SUN; }
這段程式碼實際上呼叫了7次Enum(String name, int ordinal):
new Enum<EnumTest>("MON",0); new Enum<EnumTest>("TUE",1); new Enum<EnumTest>("WED",2); ... ...
遍歷、switch 等常用操作
#對enum進行遍歷和switch的操作範例程式碼:
public class Test { public static void main(String[] args) { for (EnumTest e : EnumTest.values()) { System.out.println(e.toString()); } System.out.println("----------------我是分隔线------------------"); EnumTest test = EnumTest.TUE; switch (test) { case MON: System.out.println("今天是星期一"); break; case TUE: System.out.println("今天是星期二"); break; // ... ... default: System.out.println(test); break; } } }
輸出結果:
MON
TUE
WED
THU
FRI
#SAT
SUN
----------------我是分隔線------------------
今天是星期二
enum 物件的常用方法介紹
int compareTo(E o)
將與指定物件的順序進行比較。
Class<E> getDeclaringClass()
傳回與此枚舉常數的列舉型別相對應的 Class 物件。
String name()
傳回此列舉常數的名稱,並在其列舉宣告中宣告。
int ordinal()
傳回枚舉常數的序數(它在列舉宣告中的位置,其中初始常數序數為零)。
String toString()
傳回列舉常數的名稱,且它包含在宣告中。
static
返回帶指定的指定枚舉類型的舉舉常數。
public class Test { public static void main(String[] args) { EnumTest test = EnumTest.TUE; //compareTo(E o) switch (test.compareTo(EnumTest.MON)) { case -1: System.out.println("TUE 在 MON 之前"); break; case 1: System.out.println("TUE 在 MON 之后"); break; default: System.out.println("TUE 与 MON 在同一位置"); break; } //getDeclaringClass() System.out.println("getDeclaringClass(): " + test.getDeclaringClass().getName()); //name() 和 toString() System.out.println("name(): " + test.name()); System.out.println("toString(): " + test.toString()); //ordinal(), 返回值是从 0 开始 System.out.println("ordinal(): " + test.ordinal()); } }
輸出結果:
TUE 在MON 之後
getDeclaringClass(): com.hmw.test.EnumTest name(): TUE toString(): TUE ordinal(): 1
給enum 自訂屬性與方法
給enum 物件加一下value 的屬性和getValue() 的方法:
package com.bjpowernode.test; /** * 枚举测试类 * */ public enum EnumTest { MON(1), TUE(2), WED(3), THU(4), FRI(5), SAT(6) { @Override public boolean isRest() { return true; } }, SUN(0) { @Override public boolean isRest() { return true; } }; private int value; private EnumTest(int value) { this.value = value; } public int getValue() { return value; } public boolean isRest() { return false; } } public class Test { public static void main(String[] args) { System.out.println("EnumTest.FRI 的 value = " + EnumTest.FRI.getValue()); } }
輸出結果:
EnumTest.FRI 的 value = 5 EnumSet,EnumMap 的应用 public class Test { public static void main(String[] args) { // EnumSet的使用 EnumSet<EnumTest> weekSet = EnumSet.allOf(EnumTest.class); for (EnumTest day : weekSet) { System.out.println(day); } // EnumMap的使用 EnumMap<EnumTest, String> weekMap = new EnumMap(EnumTest.class); weekMap.put(EnumTest.MON, "星期一"); weekMap.put(EnumTest.TUE, "星期二"); // ... ... for (Iterator<Entry<EnumTest, String>> iter = weekMap.entrySet().iterator(); iter.hasNext();) { Entry<EnumTest, String> entry = iter.next(); System.out.println(entry.getKey().name() + ":" + entry.getValue()); } } }
原理分析
enum 的語法結構儘管和class 的語法結構儘管和class 的語法結構儘管和class 的語法結構儘管和 class 的語法不一樣,但是經過編譯器編譯之後產生的是一個class檔。該class檔案經過反編譯可以看到實際上是產生了一個類,該類別繼承了java.lang.Enum
public class com.hmw.test.EnumTest extends java.lang.Enum{ public static final com.hmw.test.EnumTest MON; public static final com.hmw.test.EnumTest TUE; public static final com.hmw.test.EnumTest WED; public static final com.hmw.test.EnumTest THU; public static final com.hmw.test.EnumTest FRI; public static final com.hmw.test.EnumTest SAT; public static final com.hmw.test.EnumTest SUN; static {}; public int getValue(); public boolean isRest(); public static com.hmw.test.EnumTest[] values(); public static com.hmw.test.EnumTest valueOf(java.lang.String); com.hmw.test.EnumTest(java.lang.String, int, int, com.hmw.test.EnumTest); }
所以,實際上enum 就是一個class,只不過java 編譯器幫我們做了語法的解析和編譯而已。
總結
可以把enum 看成是一個普通的class,它們都可以定義一些屬性和方法,不同之處是:enum 不能使用extends 關鍵字繼承其他類,因為enum 已經繼承了java.lang.Enum(java是單一繼承)。
以上是Java枚舉_動力節點整理歸納的詳細內容。更多資訊請關注PHP中文網其他相關文章!

新興技術對Java的平台獨立性既有威脅也有增強。 1)雲計算和容器化技術如Docker增強了Java的平台獨立性,但需要優化以適應不同雲環境。 2)WebAssembly通過GraalVM編譯Java代碼,擴展了其平台獨立性,但需與其他語言競爭性能。

不同JVM實現都能提供平台獨立性,但表現略有不同。 1.OracleHotSpot和OpenJDKJVM在平台獨立性上表現相似,但OpenJDK可能需額外配置。 2.IBMJ9JVM在特定操作系統上表現優化。 3.GraalVM支持多語言,需額外配置。 4.AzulZingJVM需特定平台調整。

平台獨立性通過在多種操作系統上運行同一套代碼,降低開發成本和縮短開發時間。具體表現為:1.減少開發時間,只需維護一套代碼;2.降低維護成本,統一測試流程;3.快速迭代和團隊協作,簡化部署過程。

Java'splatformindependencefacilitatescodereusebyallowingbytecodetorunonanyplatformwithaJVM.1)Developerscanwritecodeonceforconsistentbehavioracrossplatforms.2)Maintenanceisreducedascodedoesn'tneedrewriting.3)Librariesandframeworkscanbesharedacrossproj

要解決Java應用程序中的平台特定問題,可以採取以下步驟:1.使用Java的System類查看系統屬性以了解運行環境。 2.利用File類或java.nio.file包處理文件路徑。 3.根據操作系統條件加載本地庫。 4.使用VisualVM或JProfiler優化跨平台性能。 5.通過Docker容器化確保測試環境與生產環境一致。 6.利用GitHubActions在多個平台上進行自動化測試。這些方法有助於有效地解決Java應用程序中的平台特定問題。

類加載器通過統一的類文件格式、動態加載、雙親委派模型和平台無關的字節碼,確保Java程序在不同平台上的一致性和兼容性,實現平台獨立性。

Java編譯器生成的代碼是平台無關的,但最終執行的代碼是平台特定的。 1.Java源代碼編譯成平台無關的字節碼。 2.JVM將字節碼轉換為特定平台的機器碼,確保跨平台運行但性能可能不同。

多線程在現代編程中重要,因為它能提高程序的響應性和資源利用率,並處理複雜的並發任務。 JVM通過線程映射、調度機制和同步鎖機制,在不同操作系統上確保多線程的一致性和高效性。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)