java enum(列舉)使用詳解 + 總結
enum 的全稱為 enumeration, 是 JDK 1.5 中引入的新特性,存放在 java.lang 包中。
下面是我在使用 enum 過程中的一些經驗和總結。
原始的介面定義常量
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.hmw.test;
/**
* 列舉測試類
* @author <a href="mailto:[email protected]">何明旺</a>
*/
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 getDeclaringClass()
返回與此列舉常量的列舉型別相對應的 Class 物件。
String name()
返回此列舉常量的名稱,在其列舉宣告中對其進行宣告。
int ordinal()
返回列舉常量的序數(它在列舉宣告中的位置,其中初始常量序數為零)。
String toString()
返回列舉常量的名稱,它包含在宣告中。
static
/**
* Java學習交流QQ群:589809992 我們一起學Java!
*/
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.hmw.test;
/**
* 列舉測試類
*
* @author <a href="mailto:[email protected]">何明旺</a>
*/
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 的應用
/**
* Java學習交流QQ群:589809992 我們一起學Java!
*/
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檔案經過反編譯可以看到實際上是生成了一個類,該類繼承了java.lang.Enum。EnumTest 經過反編譯(javap com.hmw.test.EnumTest 命令)之後得到的內容如下:
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是單一繼承)。
相關推薦
Enum列舉詳解和EnumSet、EnumMap使用
一、Enum列舉 public enum Day { MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY; } 一個簡單的測試類: public class TestEnum {
java enum(列舉)使用詳解 + 總結
enum 的全稱為 enumeration, 是 JDK 1.5 中引入的新特性,存放在 java.lang 包中。下面是我在使用 enum 過程中的一些經驗和總結。原始的介面定義常量public interface IConstants { Stri
【Java】 enum(列舉)使用詳解 + 總結
enum 的全稱為 enumeration, 是 JDK 1.5 中引入的新特性,存放在 java.lang 包中。 下面是我在使用 enum 過程中的一些經驗和總結,主要包括如下內容: 8. 總結
java enum(列舉)使用詳解和總結(轉)
enum 的全稱為 enumeration, 是 JDK 1.5 中引入的新特性,存放在 java.lang 包中。 下面是我在使用 enum 過程中的一些經驗和總結,主要包括如下內容: 1. 原始的介面定義常量 2. 語法(定義) 3. 遍歷、switch 等常用
java enum(列舉)使用詳解
說來慚愧,一直沒有怎麼使用過列舉,只知道可以定義日期中的星期幾,沒有用到也就沒有學習,現在還是覺得應該認真瞭解下,在可以用到的時候也會發現原來列舉也可以解決這個問題。廢話不多說了,詳細在下面: 原始的介面定義常量 public
Java 列舉enum 使用詳解
在實際程式設計中,往往存在著這樣的“資料集”,它們的數值在程式中是穩定的,而且“資料集”中的元素是有限的。 例如星期一到星期日七個資料元素組成了一週的“資料集”,春夏秋冬四個資料元素組成了四季的“資料集”。 在java中如何更好的使用這些“資料集”呢?因此列舉便派上了用場,
高階Java列舉型別enum使用詳解
java的Enum列舉型別終於在j2se1.5出現了。之前覺得它只不過是雞肋而已,可有可無。畢竟這麼多年來,沒有它,大家不都過得很好嗎?今 日看《Thinking in Java》4th edition,裡面有一句話“有時恰恰因為它,你才能夠"優雅而乾淨"地解決問題。優雅
Java虛擬機詳解——JVM常見問題總結
can 語言 嘗試 意思 是把 fff rom com serial 【正文】 聲明:本文只是做一個總結,有關jvm的詳細知識可以參考之前的系列文章,尤其是那篇:Java虛擬機詳解04—-GC算法和種類。那篇文章和本文是面試時的重點。 面試必問關鍵詞:JVM垃圾回收、類加載
100.【JAVA程式設計】列舉詳解
列舉:是有界集合體 public class EnumDemo { enum SexEnum { MAN, WOMAN } public static void main(String[] args){ for(Se
java 列舉詳解
1. 概述 列舉(enum)全寫為的全稱為:enumeration。是jdk1.5才新引進的概念,在Java中enum的有與C、C++相似的基本用法,也有很多擴充套件的用法。 儘管列舉型別看著像一種新的資料型別,但實際上它是一種受限制的類(繼承自java.lang.E
Java虛擬機器詳解----JVM常見問題總結
【宣告】 歡迎轉載,但請保留文章原始出處→_→ 【正文】 宣告:本文只是做一個總結,有關jvm的詳細知識可以參考本人之前的系列文章,尤其是那篇:Java虛擬機器詳解04----GC演算法和種類。那篇文章和本文是面試時的重點。 面試必問關鍵詞:JVM垃圾回
Java學習系列(二十二)Java面向物件之列舉詳解
一、前言 今天我們來講講列舉,希望通過這篇部落格大家能對列舉有個更全面的瞭解。列舉是一種例項(大寫)數固定的類(不能再建立例項),列舉改變了常量的宣告方式,而且它在編譯期間就限定了型別。列舉多用於確定的狀態數(如:滑鼠上下左右、IM訊息已讀未讀)、型別數(如:系統
Java多執行緒詳解總結
### 一、基本概念 **程式(program)**: 是為完成特定任務、用某種語言編寫的一組指令的集合。即指一 段靜態的程式碼,靜態物件。 **程序(process)**:是程式的一次執行過程,或是正在執行的一個程式。是一個動態 的過程:有它自身的產生、存在和消亡的過程。——生命週期 - 執行中的
java.util包詳解(二)——Connection接口
操作 相同 元素 叠代 cat roo soft true nbsp Connection接口介紹 Connection接口是java集合的root接口,沒有實現類,只有子接口和實現子接口的各種容器。主要用來表示java集合這一大的抽象概念。 Connection接
java對象詳解
add splay view created 元素 繼承關系 外部 優化 csdn java對象詳解 內存布局 普通對象布局 數組的內存布局 內部類的內存布局 對象分解 對象頭-mark word(8字節) 實例數據 對齊填充(可選) java鎖分析
Java泛型詳解
對象數組 整形 泛型方法 tty 接受 一個 div -m color 泛型的本質是參數化類型,也就是說所操作的數據類型被指定為一個參數。 假定我們有這樣一個需求:寫一個排序方法,能夠對整形數組、字符串數組甚至其他任何類型的數組進行排序,該如何實現? 答案是可以使用 Ja
Java常量池詳解
回收 array 數值 編譯期 二進制格式 new 保持 占用 get 轉自:http://www.cnblogs.com/iyangyuan/p/4631696.html jvm虛擬內存分布圖: 程序計數器:JVM執行程序的流水線。 本地方法棧:JVM調用操作系統方法所
Java線程詳解(一)
線程 thread runnable 程序、進程、線程的概念 程序(program):是為完成特定任務、用某種語言編寫的一組指令的集合。即指一段靜態的代碼,靜態對象。 進程(process):是程序的一次執行過程,或是正在運行的一個程序。動態過程:有它自身的產生、存在和消亡的過程。 如
Java反射機制詳解一
java 反射 反射機制 工廠模式 1反射機制是什麽反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱為java語言的反射機制。在面向對象的世界裏,萬事萬物皆對象.在ja
JAVA環境配置詳解
指向 微軟 ssp cep 解釋 引入 bin testcase loader 步驟:一下載安裝JDK(註意版本)二配置環境變量 JAVA_HOME:JDK的安裝路徑 CLASSPATH:.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\too