成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

Java中的Enum的使用與分析

stefanieliang / 693人閱讀

摘要:但是,枚舉類(lèi)的構(gòu)造器有很大的不同構(gòu)造器只是在構(gòu)造枚舉值的時(shí)候被調(diào)用。中的返回的是兩個(gè)枚舉值的順序之差。當(dāng)然,前提是兩個(gè)枚舉值必須屬于同一個(gè)枚舉類(lèi),否則會(huì)拋出異常。

  

原文引用自:http://www.cnblogs.com/frankliiu-java/archive/2010/12/07/1898721.html

示例:

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中枚舉實(shí)現(xiàn)的分析:

示例:

public enum Color{
RED,BLUE,BLACK,YELLOW,GREEN
}
顯然,enum很像特殊的class,實(shí)際上enum聲明定義的類(lèi)型就是一個(gè)類(lèi)。 而這些類(lèi)都是類(lèi)庫(kù)中Enum類(lèi)的子類(lèi)(java.lang.Enum)。它們繼承了這個(gè)Enum中的許多有用的方法。我們對(duì)代碼編譯之后發(fā)現(xiàn),編譯器將enum類(lèi)型多帶帶編譯成了一個(gè)字節(jié)碼文件:Color.class。
Color字節(jié)碼代碼
final enum hr.test.Color {

// 所有的枚舉值都是類(lèi)靜態(tài)常量
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;

// 初始化過(guò)程,對(duì)枚舉類(lèi)的所有枚舉值對(duì)象進(jìn)行第一次初始化
static {
0 new hr.test.Color [1]
3 dup
4 ldc [16] //把枚舉值字符串"RED"壓入操作數(shù)棧
6 iconst_0 // 把整型值0壓入操作數(shù)棧
7 invokespecial hr.test.Color(java.lang.String, int) [17] //調(diào)用Color類(lèi)的私有構(gòu)造器創(chuàng)建Color對(duì)象RED
10 putstatic hr.test.Color.RED : hr.test.Color [21] //將枚舉對(duì)象賦給Color的靜態(tài)常量RED。
......... 枚舉對(duì)象BLUE等與上同
102 return
};

// 私有構(gòu)造器,外部不可能動(dòng)態(tài)創(chuàng)建一個(gè)枚舉類(lèi)對(duì)象(也就是不可能動(dòng)態(tài)創(chuàng)建一個(gè)枚舉值)。
private Color(java.lang.String arg0, int arg1){
// 調(diào)用父類(lèi)Enum的受保護(hù)構(gòu)造器創(chuàng)建一個(gè)枚舉對(duì)象
3 invokespecial java.lang.Enum(java.lang.String, int) [38]
};

public static hr.test.Color[] values();

// 實(shí)現(xiàn)Enum類(lèi)的抽象方法
public static hr.test.Color valueOf(java.lang.String arg0);
}

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

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

2、即然枚舉類(lèi)是class,當(dāng)然在枚舉類(lèi)型中有構(gòu)造器,方法和數(shù)據(jù)域。但是,枚舉類(lèi)的構(gòu)造器有很大的不同:
(1) 構(gòu)造器只是在構(gòu)造枚舉值的時(shí)候被調(diào)用。
Java代碼
enum Color{
RED(255,0,0),BLUE(0,0,255),BLACK(0,0,0),YELLOW(255,255,0),GREEN(0,255,0);
//構(gòu)造枚舉值,比如RED(255,0,0)
private Color(int rv,int gv,int bv){
this.redValue=rv;
this.greenValue=gv;
this.blueValue=bv;
}

            public String toString(){  //覆蓋了父類(lèi)Enum的toString()  
            return super.toString()+"("+redValue+","+greenValue+","+blueValue+")";  
            }  

            private int redValue;  //自定義數(shù)據(jù)域,private為了封裝。  
            private int greenValue;  
            private int blueValue;  

}
(2) 構(gòu)造器只能私有private,絕對(duì)不允許有public構(gòu)造器。 這樣可以保證外部代碼無(wú)法新構(gòu)造枚舉類(lèi)的實(shí)例。這也是完全符合情理的,因?yàn)槲覀冎烂杜e值是public static final的常量而已。 但枚舉類(lèi)的方法和數(shù)據(jù)域可以允許外部訪問(wèn)。
Java代碼
public static void main(String args[])
{
// Color colors=new Color(100,200,300); //wrong
Color color=Color.RED;
System.out.println(color); // 調(diào)用了toString()方法
}

3、所有枚舉類(lèi)都繼承了Enum的方法,下面我們?cè)敿?xì)介紹這些方法。
(1) ordinal()方法: 返回枚舉值在枚舉類(lèi)種的順序。這個(gè)順序根據(jù)枚舉值聲明的順序而定。
Color.RED.ordinal(); //返回結(jié)果:0
Color.BLUE.ordinal(); //返回結(jié)果:1
(2) compareTo()方法: Enum實(shí)現(xiàn)了java.lang.Comparable接口,因此可以比較象與指定對(duì)象的順序。Enum中的compareTo返回的是兩個(gè)枚舉值的順序之差。當(dāng)然,前提是兩個(gè)枚舉值必須屬于同一個(gè)枚舉類(lèi),否則會(huì)拋出ClassCastException()異常。(具體可見(jiàn)源代碼)
Color.RED.compareTo(Color.BLUE); //返回結(jié)果 -1
(3) values()方法: 靜態(tài)方法,返回一個(gè)包含全部枚舉值的數(shù)組。
Color[] colors=Color.values();
for(Color c:colors){
System.out.print(c+",");
}//返回結(jié)果:RED,BLUE,BLACK YELLOW,GREEN,
(4) toString()方法: 返回枚舉常量的名稱(chēng)。
Color c=Color.RED;
System.out.println(c);//返回結(jié)果: RED
(5) valueOf()方法: 這個(gè)方法和toString方法是相對(duì)應(yīng)的,返回帶指定名稱(chēng)的指定枚舉類(lèi)型的枚舉常量。
Color.valueOf("BLUE"); //返回結(jié)果: Color.BLUE
(6) equals()方法: 比較兩個(gè)枚舉類(lèi)對(duì)象的引用。
Java代碼
//JDK源代碼:
public final boolean equals(Object other) {
return this==other;
}

4、枚舉類(lèi)可以在switch語(yǔ)句中使用。
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;
}

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/64161.html

相關(guān)文章

  • Java 總結(jié)

    摘要:中的詳解必修個(gè)多線程問(wèn)題總結(jié)個(gè)多線程問(wèn)題總結(jié)有哪些源代碼看了后讓你收獲很多,代碼思維和能力有較大的提升有哪些源代碼看了后讓你收獲很多,代碼思維和能力有較大的提升開(kāi)源的運(yùn)行原理從虛擬機(jī)工作流程看運(yùn)行原理。 自己實(shí)現(xiàn)集合框架 (三): 單鏈表的實(shí)現(xiàn) 自己實(shí)現(xiàn)集合框架 (三): 單鏈表的實(shí)現(xiàn) 基于 POI 封裝 ExcelUtil 精簡(jiǎn)的 Excel 導(dǎo)入導(dǎo)出 由于 poi 本身只是針對(duì)于 ...

    caspar 評(píng)論0 收藏0
  • Java對(duì)象內(nèi)存占用分析

    摘要:對(duì)于不同的實(shí)現(xiàn),對(duì)象占用的內(nèi)存空間大小可能不盡相同,本文主要分析中的情況,實(shí)驗(yàn)環(huán)境為位系統(tǒng),使用進(jìn)行結(jié)論驗(yàn)證。內(nèi)存占用這里分析一個(gè)只有一組鍵值對(duì)的結(jié)構(gòu)如下首先分析本身的大小。 本文深入分析并驗(yàn)證了不同Java對(duì)象占用內(nèi)存空間大小的情況。對(duì)于不同的jvm實(shí)現(xiàn),Java對(duì)象占用的內(nèi)存空間大小可能不盡相同,本文主要分析HotSpot jvm中的情況,實(shí)驗(yàn)環(huán)境為64位window10系統(tǒng)、JD...

    JouyPub 評(píng)論0 收藏0
  • Java語(yǔ)法糖編譯結(jié)果分析(二)

    摘要:因此,對(duì)應(yīng)地我們可以翻譯這段二進(jìn)制字節(jié)碼為這樣的代碼注意,這段代碼并不能通過(guò)編譯,因?yàn)樵创a這一層是不允許直接繼承的,這個(gè)繼承過(guò)程只允許在編譯器內(nèi)部解語(yǔ)法糖的過(guò)程中被編譯器添加,添加之后的類(lèi)才會(huì)有的訪問(wèn)標(biāo)識(shí)符。 語(yǔ)法糖(Syntactic Sugar)的出現(xiàn)是為了降低我們編寫(xiě)某些代碼時(shí)陷入的重復(fù)或繁瑣,這使得我們使用語(yǔ)法糖后可以寫(xiě)出簡(jiǎn)明而優(yōu)雅的代碼。在Java中不加工的語(yǔ)法糖代碼運(yùn)行時(shí)可...

    LeviDing 評(píng)論0 收藏0
  • Java枚舉類(lèi)學(xué)習(xí)到進(jìn)階

    摘要:枚舉是聲明一組命名的常數(shù),當(dāng)一個(gè)變量有幾種可能的取值時(shí),可以將它定義為枚舉類(lèi)型。注意枚舉只是枚舉類(lèi)型,不能夠賦值操作。 枚舉類(lèi)型是Java 5中新增特性的一部分,它是一種特殊的數(shù)據(jù)類(lèi)型,之所以特殊是因?yàn)樗仁且环N類(lèi)(class)類(lèi)型卻又比類(lèi)類(lèi)型多了些特殊的約束,但是這些約束的存在也造就了枚舉類(lèi)型的簡(jiǎn)潔性、安全性以及便捷性?!饔械牡胤竭€沒(méi)有學(xué)的透徹,之后會(huì)繼續(xù)學(xué)習(xí)修改更新本文章 1.枚...

    Juven 評(píng)論0 收藏0
  • javap命令Java Dcompiler工具、IDEA自帶反編譯器反編譯結(jié)果差別及原因

    摘要:反匯編器與反編譯器不同,反編譯器的目標(biāo)是高級(jí)語(yǔ)言而非匯編語(yǔ)言。反匯編器的反匯編輸出通常格式化為適合人類(lèi)閱讀,而非用作匯編器的輸入源,因此它主要是一個(gè)逆向工程工具。本文章參考了通過(guò)命令分析匯編指令反匯編器 問(wèn)題描述 寫(xiě)這篇文章是為了記錄我這幾天遇到的一個(gè)疑惑,并且順藤摸瓜的學(xué)習(xí)一下javap命令。遇到的疑惑是這樣的:我在看使用枚舉類(lèi)型實(shí)現(xiàn)單列模式的博客時(shí),發(fā)現(xiàn)一些博客中寫(xiě)到的枚舉類(lèi)型的反...

    張憲坤 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<