Java中的Enum的使用與分析

示例:

public enum EnumTest {
FRANK("The given name of me"),
LIU("The family name of me");
private String context;
private String getContext(){
return this.context;
}
private EnumTest(String context){
this.context = context;
}
public static void main(String[] args){
for(EnumTest name :EnumTest.values()){
System.out.println(name+" : "+name.getContext());
}
System.out.println(EnumTest.FRANK.getDeclaringClass());
}

}?

?Java中枚舉實現的分析:

示例:?

public enum Color{  RED,BLUE,BLACK,YELLOW,GREEN  
}  

顯然,enum很像特殊的class,實際上enum聲明定義的類型就是一個類。?而這些類都是類庫中Enum類的子類(java.lang.Enum<E>)。它們繼承了這個Enum中的許多有用的方法。我們對代碼編譯之后發現,編譯器將enum類型單獨編譯成了一個字節碼文件:Color.class。

Color字節碼代碼?
final enum hr.test.Color {  // 所有的枚舉值都是類靜態常量  public static final enum hr.test.Color RED;  public static final enum hr.test.Color BLUE;  public static final enum hr.test.Color BLACK;  public static final enum hr.test.Color YELLOW;  public static final enum hr.test.Color GREEN;  private static final synthetic hr.test.Color[] ENUM$VALUES;  // 初始化過程,對枚舉類的所有枚舉值對象進行第一次初始化  static {  0  new hr.test.Color [1]   3  dup  4  ldc <String "RED"> [16] //把枚舉值字符串"RED"壓入操作數棧  6  iconst_0  // 把整型值0壓入操作數棧  7  invokespecial hr.test.Color(java.lang.String, int) [17] //調用Color類的私有構造器創建Color對象RED  10  putstatic hr.test.Color.RED : hr.test.Color [21]  //將枚舉對象賦給Color的靜態常量RED。  
      .........  枚舉對象BLUE等與上同  102  return  
};  // 私有構造器,外部不可能動態創建一個枚舉類對象(也就是不可能動態創建一個枚舉值)。  private Color(java.lang.String arg0, int arg1){  // 調用父類Enum的受保護構造器創建一個枚舉對象  3  invokespecial java.lang.Enum(java.lang.String, int) [38]  
};  public static hr.test.Color[] values();  // 實現Enum類的抽象方法    public static hr.test.Color valueOf(java.lang.String arg0);  
} 

下面我們就詳細介紹enum定義的枚舉類的特征及其用法。(后面均用Color舉例)

1、Color枚舉類就是class,而且是一個不可以被繼承的final類。其枚舉值(RED,BLUE...)都是Color類型的類靜態常量,?我們可以通過下面的方式來得到Color枚舉類的一個實例:
??????????????? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? Color c=Color.RED;?
注意:這些枚舉值都是public static final的,也就是我們經常所定義的常量方式,因此枚舉類中的枚舉值最好全部大寫。?

2、即然枚舉類是class,當然在枚舉類型中有構造器,方法和數據域。但是,枚舉類的構造器有很大的不同:?
??????(1) 構造器只是在構造枚舉值的時候被調用。

Java代碼?
enum Color{  RED(255,0,0),BLUE(0,0,255),BLACK(0,0,0),YELLOW(255,255,0),GREEN(0,255,0);  //構造枚舉值,比如RED(255,0,0)  private Color(int rv,int gv,int bv){  this.redValue=rv;  this.greenValue=gv;  this.blueValue=bv;  }  public String toString(){  //覆蓋了父類Enum的toString()  return super.toString()+"("+redValue+","+greenValue+","+blueValue+")";  }  private int redValue;  //自定義數據域,private為了封裝。  private int greenValue;  private int blueValue;  }  

? (2) 構造器只能私有private,絕對不允許有public構造器。?這樣可以保證外部代碼無法新構造枚舉類的實例。這也是完全符合情理的,因為我們知道枚舉值是public static final的常量而已。 但枚舉類的方法和數據域可以允許外部訪問。

Java代碼?
public static void main(String args[])  
{  // Color colors=new Color(100,200,300);  //wrong  Color color=Color.RED;  System.out.println(color);  // 調用了toString()方法  
}     

3、所有枚舉類都繼承了Enum的方法,下面我們詳細介紹這些方法。?
?????? (1)? ordinal()方法: 返回枚舉值在枚舉類種的順序。這個順序根據枚舉值聲明的順序而定。
???? ??????????? Color.RED.ordinal();? //返回結果:0
??? ???????????? Color.BLUE.ordinal();? //返回結果:1
?????? (2)? compareTo()方法: Enum實現了java.lang.Comparable接口,因此可以比較象與指定對象的順序。Enum中的compareTo返回的是兩個枚舉值的順序之差。當然,前提是兩個枚舉值必須屬于同一個枚舉類,否則會拋出ClassCastException()異常。(具體可見源代碼)
???????????????? Color.RED.compareTo(Color.BLUE);? //返回結果 -1
?????? (3)? values()方法: 靜態方法,返回一個包含全部枚舉值的數組。
???????????????? Color[] colors=Color.values();
??? ???????????? for(Color c:colors){
??? ??? ??????????????? System.out.print(c+",");?
??? ?? ? ? ? ??? }//返回結果:RED,BLUE,BLACK YELLOW,GREEN,
?????? (4)? toString()方法: 返回枚舉常量的名稱。
??? ???????????? Color c=Color.RED;
??? ???????????? System.out.println(c);//返回結果: RED
?????? (5)? valueOf()方法: 這個方法和toString方法是相對應的,返回帶指定名稱的指定枚舉類型的枚舉常量。
??? ???????????? Color.valueOf("BLUE");?? //返回結果: Color.BLUE
?????? (6)? equals()方法: 比較兩個枚舉類對象的引用。

Java代碼?
//JDK源代碼:      
public final boolean equals(Object other) {  return this==other;  
}     

4、枚舉類可以在switch語句中使用。

Java代碼?
Color color=Color.RED;  
switch(color){  case RED: System.out.println("it's red");break;  case BLUE: System.out.println("it's blue");break;  case BLACK: System.out.println("it's blue");break;  
}  

?

轉載于:https://www.cnblogs.com/vinozly/p/5030932.html

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

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

相關文章

postgresql返回行數_怎么優化你的SQL查詢?以PostgreSQL為例

實際工作中&#xff0c;我們每個人難免都會要寫SQL&#xff0c;執行SQL&#xff0c;但是有時時候執行非常慢&#xff0c;甚至獲得不了結果。這時候你會怎么辦&#xff1f;放棄&#xff1f;去苦口婆心的求隔壁房間胡子擦擦的猥瑣DBA大叔&#xff1f;NO&#xff0c;正確方法是先檢…

首次構建android studio gradle 下載緩慢的問題

1、先使用其他工具下載gradle&#xff0c; https\://services.gradle.org/distributions/gradle-2.14.1-all.zip 2、然后放在C:\Users\Administrator\.gradle\wrapper\dists\gradle-2.14.1-all\8bnwg5hd3w55iofp58khbp6yv 目錄中 隨機碼文件夾可以通過先嘗試構建&#xff0c;讓…

288. Unique Word Abbreviation

題目&#xff1a; An abbreviation of a word follows the form <first letter><number><last letter>. Below are some examples of word abbreviations: a) it --> it (no abbreviation)1 b) d|o|g --> d…

jqgrid mysql 分頁_jQgrid 分頁顯示

當使用jqgrid去顯示數據的時候&#xff0c;如果數據太多&#xff0c;那么jqgrid就會繪制的很慢&#xff0c;這樣很影響用戶的體驗&#xff0c;十分影響用戶的心情&#xff0c;所以我們采用分頁的方式去取數據&#xff0c;這樣就能避免用戶長時間的等待&#xff0c;從而提升用戶…

echarts 詞云_python Flask+爬蟲制作股票查詢、歷史數據、股評詞云網頁

自學python的數據分析&#xff0c;爬蟲后&#xff0c;花了幾天時間看視頻學習Flask做了一個簡單的股票查詢網頁。本來還想著加入一些其他功能&#xff0c;比如財務指標分析&#xff0c;輿情分析&#xff0c;最完美的想法是做成一個股票評分系統&#xff0c;輸入股票代碼可以自動…

JavaSE基礎知識(6)—異常和異常處理

一、異常的理解及體系結構圖 1、理解 異常&#xff1a;程序運行過程中發生的不正常現象。java中的錯誤&#xff1a;   語法錯誤   運行異常   邏輯錯誤 2、體系圖 java程序在執行過程中所發生的異常分為兩類&#xff1a; Error&#xff1a;Java虛擬機無法解決的嚴重問題。…

peripheralStateNotificationCB

1 /*********************************************************************2 * fn peripheralStateNotificationCB 外圍設備 狀態 通知 回調函數3 *4 * brief Notification from the profile of a state change. 通知來自于profile的狀態改變&#xff01;5 *6 * …

mysql dump 1017_MySQL數據庫導出 - Can't Wait Any Longer - OSCHINA - 中文開源技術交流社區...

本文內容主要來自MySQL官方文檔&#xff1a;“MySQL5.1 Reference&#xff0c;2.10.3. 將MySQL數據庫拷貝到另一臺機器”注意&#xff1a;參數名與值間可以不用空格&#xff0c;如-uroot或-u root均可&#xff1b;某些參數會有不同含義1.數據庫導出(-A導出所有數據庫&#xff0…

Jsp2.0自定義標簽(第二天)——自定義循環標簽

今天是學習自定義標簽的第二天&#xff0c;主要是寫一個自定義的循環標簽。 先看效果圖&#xff1a; 前臺頁面Jsp代碼 <% page language"java" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8"%> <%taglib prefix"myout…

正則表達式以什么開頭以什么結尾_股票hk是什么意思,股票st開頭是什么意思,新通聯股票...

股票hk是什么意思,股票st開頭是什么意思,新通聯股票股票hk是什么意思,股票st開頭是什么意思,新通聯股票我們首先解決時間跨度問題&#xff1a;如果您為諸如退休之類的遙遠目標投資&#xff0c;則應主要投資股票(同樣&#xff0c;我們建議您通過共同基金投資)。心理控制第一&…

讀書筆記--SQL必知必會03--排序檢索數據

3.1 排序數據 子句&#xff08;clause&#xff09; SQL語句由子句構成。一個子句通常由一個關鍵字加上所提供的數據組成。 ORDER BY子句可以取一個或多個列的名字&#xff0c;將SELECT語句檢索出的數據進行排序。 ORDER BY子句可以使用非檢索的列排序數據。 ORDER BY子句必須作…

mysql中編寫匿名塊_Oracle數據庫之Oracle_PL/SQL(1) 匿名塊

本文主要向大家介紹了Oracle數據庫之Oracle_PL/SQL(1) 匿名塊&#xff0c;通過具體的內容向大家展現&#xff0c;希望對大家學習Oracle數據庫有所幫助。1. PL/SQL 簡介PL/SQL是一種比較復雜的程序設計語言, 用于從各種環境中訪問Oracle數據庫。為什么使用PL/SQL&#xff1f;Ora…

安裝了多個Oracle11g的客戶端,哪個客戶端的tnsnames.ora會起作用?

如果我們由于需要安裝了多個Oracle的client&#xff0c;哪個客戶端的tnsnames.ora會起作用呢&#xff1f; 答案是&#xff1a; 在安裝好clinent端后&#xff0c;安裝程序會把client的bin目錄放到path里面&#xff0c;path中在前面的client會被首先搜索&#xff0c;其中的tnsnam…

電腦顯示連接了網絡但是不能上網_為什么電腦插上網線顯示已連接卻上不了網...

嘗試斷一下網&#xff0c;或者重啟一下系統看一下是否解決&#xff1b;也可能是開啟了網絡代理&#xff0c;可以重置一下瀏覽器或者網絡設置&#xff1b;還可以使用安全管家軟件&#xff0c;掃描一下網絡設置。以下是詳細介紹&#xff1a;1、有時候系統顯示已經連接其實并沒有真…

Atcoder ARC101 E 樹dp

https://arc101.contest.atcoder.jp/tasks/arc101_c 題解是也是dp&#xff0c;好像是容斥做的&#xff0c;但是看不懂&#xff0c;而且也好像沒講怎么變n^2&#xff0c;看了寫大佬的代碼&#xff0c;自己理解了一下 #include <bits/stdc.h> #include <ext/pb_ds/assoc…

compress命令--Linux命令應用大詞典729個命令解讀

內容來源于人民郵電出版社《Linux命令應用大詞典》講述729個命令&#xff0c;1935個例子學習Linux系統的參考書、案頭書&#xff0c;遇到不懂的命令或命令選項一查即可爭取每天都發布內容本文出自 “airfish2000” 博客&#xff0c;更多命令查看博客&#xff1a;http://airfish…

javaweb學習總結(三十九)——數據庫連接池

javaweb學習總結(三十九)——數據庫連接池 數據庫連接池的實現及原理 JNDI 在 J2EE 中的角色轉載于:https://www.cnblogs.com/daishuguang/p/5041845.html

python getopterror_python3 getopt用法

python channel_builder.py -s /Users/graypn/ -d /Users/graypn/Documents -m 7 --outreport/xx.html參數也分長格式和短格式短格式&#xff1a;-s長格式&#xff1a;--sourceopts, args getopt.getopt(sys.argv[1:], "hs:d:m:v:p:c:",["help", "sr…

excel刪除空行_Excel里99.9%的人都踩過的坑,早看早避開!

本文作者丨可可&#xff08;小 E 背后的小仙女&#xff09;本文由「秋葉 Excel」原創發布如需轉載&#xff0c;請在公眾號發送關鍵詞「轉載」查看說明2019 年上班第一天感覺怎么樣呢&#xff1f;望著滿屏幕鋪天蓋地的表格&#xff0c;我只能摸摸自己還沒下去的小肚子&#xff0…

CentOS 6.5 Zabbix-agent3.2 安裝 1.0版

1.關閉防火墻service iptables stop2.更換源、安裝zabbix-agentrpm -ivh http://repo.zabbix.com/zabbix/3.2/rhel/6/x86_64/zabbix-release-3.2-1.el6.noarch.rpmyum install -y zabbix-agent3.修改配置文件vim /etc/zabbix/zabbix_agentd.confServer192.168.8.228 ser…