Ⅰ 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中如何判斷一個變數是否屬於某個枚舉類型中的元素
介面 Enumeration的兩個函數 boolean hasMoreElements()測試此枚舉是否包含更多的元素。 nextElement()如果此枚舉對象至少還有一個可提供的元素,則返回此枚舉的下一個元素。 利用這兩個函數,利用while循環就可以讀取裡面的元素,當然讀取出來得元素通過強制轉換,就可以和變數進行比較 。