導航:首頁 > 源碼編譯 > java枚舉類型編譯

java枚舉類型編譯

發布時間:2024-10-30 08:41:34

java中枚舉怎麼遍歷

我們可以通過反射, 以及枚舉類的靜態方法values()來進行遍歷:
代碼:
enum Rating {
UNRATED, G, PG, PG13, R, NC17
}
public class Test {
public static void main(String args[]) {
System.out.println("第一種通過反射");
Class clz = Rating.class;
for (Object obj: clz.getEnumConstants()) {
System.out.println(obj);
}
System.out.println("第二種通過枚舉靜態方法values()");
for (Rating rate: Rating.values()) {
System.out.println(rate);
}
}
}
運行結果:
第一種通過反射
UNRATED
G
PG
PG13
R
NC17
第二種通過枚舉靜態方法values()
UNRATED
G
PG
PG13
R
NC17

Ⅱ Java 枚舉型為什麼是靜態的,以及是怎麼實現的

是的,Java枚舉型是靜態常量,隱式地用static final修飾過。

確切地說,Java枚舉型是「靜態常量」,這裡麵包含了兩層意思:

枚舉型中的實例隱式地用static final修飾過。
枚舉型作為某個類中的成員欄位也隱式地用static final修飾過。

public class Traffic{
public enum Light{GREEN,YELLOW,RED}
}

還是你上面這個代碼,反編譯一下,你就能看到--編譯器背著你偷偷做了哪些手腳:
/*
* Decompiled with CFR 0_118.
*/
package com.ciaoshen.thinkinjava.chapter19;

public class Traffic {

public static final class Light
extends Enum<Light> {
public static final /* enum */ Light GREEN = new Light();
public static final /* enum */ Light YELLOW = new Light();
public static final /* enum */ Light RED = new Light();
private static final /* synthetic */ Light[] $VALUES;

public static Light[] values() {
return (Light[])$VALUES.clone();
}

public static Light valueOf(String string) {
return Enum.valueOf(Light.class, string);
}

private Light() {
super(string, n);
}

static {
$VALUES = new Light[]{GREEN, YELLOW, RED};
}
}

}

首先,枚舉型Light是個實實在在的類。繼承自基類Enum<Light>。然後在你不知情的情況下,偷偷加了static final修飾詞。

然後三個枚舉實例GREEN, YELLOW, RED也確確實實是Light的實例。然而前面也加上了static final。

然後構造器也被偷偷地閹割成private。這種實例控制手段,是不是在單例器模式里也見過?所以枚舉也是實現單例器的一種方法。

然後編譯器還偷偷合成了Light[]數組,一個values( )方法,一個valueOf( )方法。這個values( )在Enum的文檔里都找不到。

如果在Enum里定義一個相關方法,你還會看到一個匿名內部類:
public enum Light{
GREEN{public void show(){System.out.println("Green");}},
YELLOW{public void show(){System.out.println("Yellow");}},
RED{public void show(){System.out.println("Red");}};
}

反編譯的結果如下:
/*
* Decompiled with CFR 0_118.
*/
package com.ciaoshen.thinkinjava.chapter18;

import java.io.PrintStream;

public class Light
extends Enum<Light> {
public static final /* enum */ Light GREEN = new Light("GREEN", 0){

public void show() {
System.out.println("Green");
}
};
public static final /* enum */ Light YELLOW = new Light("YELLOW", 1){

public void show() {
System.out.println("Yellow");
}
};
public static final /* enum */ Light RED = new Light("RED", 2){

public void show() {
System.out.println("Red");
}
};
private static final /* synthetic */ Light[] $VALUES;

public static Light[] values() {
return (Light[])$VALUES.clone();
}

public static Light valueOf(String string) {
return Enum.valueOf(Light.class, string);
}

private Light() {
super(string, n);
}

static {
$VALUES = new Light[]{GREEN, YELLOW, RED};
}

}

總之,Java的Enum枚舉型整個就是一個大大的「語法糖」。明明是一個完整的類,但只向用戶暴露幾個靜態常量,隱藏掉大部分實現的細節。

Ⅲ java中switcht(枚舉類型)編譯不通過求大俠幫忙!!!

enum Color {red,green,yellow
};
public class Sample4_2
{
public static void main(String args[])
{
Color lc=Color.green;
switch(lc)
{
case red:
System.out.println("紅燈亮");break;
case green:
System.out.println("綠燈亮");break;
case yellow:
System.out.println("黃燈亮");break;
}
}
}
這樣就行了,調試成功。你的錯誤在於沒加break;他執行完不跳出,繼續執行下一條語句。
switch的用法是找到入口進入,一直往下運行,直到碰到break;或運行完所有代碼停止
我使用Eclipse調試的

Ⅳ java中如何判斷一個變數是否屬於某個枚舉類型中的元素

閱讀全文

與java枚舉類型編譯相關的資料

熱點內容
次肋梁需要加密嗎 瀏覽:744
安徽蚌埠社保卡號用哪個app 瀏覽:217
php手冊下載哪個好 瀏覽:163
安卓轉蘋果為什麼轉不成功 瀏覽:226
華為榮耀系統編譯 瀏覽:733
看板塊app哪個好用 瀏覽:666
java即時編譯結果怎麼保存 瀏覽:911
java工程師在深圳 瀏覽:658
手機sql編譯軟體 瀏覽:524
外網伺服器地址購買 瀏覽:994
空調壓縮機電容價格 瀏覽:381
小程序選什麼雲伺服器 瀏覽:656
如何把java編譯回中文 瀏覽:777
天聯軟體伺服器地址是什麼 瀏覽:964
stc單片機加密 瀏覽:140
小程序地產廣告源碼 瀏覽:542
消費者信息加密私域 瀏覽:431
程序員開發團隊可以怎麼創業 瀏覽:925
設備共享伺服器是什麼意思 瀏覽:126
java符號類型 瀏覽:331