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

熱點內容
什麼app能下載多鄰國 瀏覽:234
伺服器藍色什麼意思 瀏覽:226
vb組態軟體源碼 瀏覽:698
加密蚊帳防蚊門簾 瀏覽:828
vs2010多線程編程 瀏覽:214
新股上市指標源碼 瀏覽:699
c語言51單片機教程 瀏覽:554
app中的hd是什麼意思 瀏覽:279
手機什麼解壓器最好 瀏覽:49
什麼是適合自己的app 瀏覽:451
雲伺服器怎麼補漏洞 瀏覽:176
如何看自己的安卓是什麼等級 瀏覽:633
被丁磊挖走的程序員 瀏覽:19
gsk980ta編程 瀏覽:507
單片機離線 瀏覽:84
解壓助眠敲擊外國長指甲 瀏覽:421
3次元編程 瀏覽:803
夫妻傳送英文命令 瀏覽:316
程序員題代做 瀏覽:950
戴爾伺服器怎麼擴大內存 瀏覽:641