導航:首頁 > 源碼編譯 > 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枚舉類型編譯相關的資料

熱點內容
python股票技術指標庫 瀏覽:549
機械式蒸汽再壓縮技術 瀏覽:721
爐石傳說查找命令 瀏覽:136
釘釘怎麼加密電話錄音 瀏覽:766
inf在python怎麼用 瀏覽:743
編譯時報錯怎麼處理 瀏覽:35
蘋果手機微核為什麼沒有伺服器呢 瀏覽:655
利用python自動發布商品 瀏覽:948
我的世界命令方塊熊貓 瀏覽:724
安卓怎麼建游戲小號 瀏覽:165
如何給安卓機下載開源游戲系統 瀏覽:505
瞬態可壓縮步長 瀏覽:689
一個正偶數分成兩個素數的演算法 瀏覽:200
Python創建一列 瀏覽:429
氟圈壓縮永久變形 瀏覽:216
拼多多APP怎麼查號 瀏覽:918
編譯文案用什麼軟體 瀏覽:953
小白在程序員大佬面前時的樣子 瀏覽:729
電梯口加密後還能延期嗎 瀏覽:907
為什麼蘋果跟安卓性能差距拉不近 瀏覽:959