导航:首页 > 源码编译 > 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枚举类型编译相关的资料

热点内容
录音笔如何修改文件夹 浏览:643
八爪鱼数据采集加密文字替换 浏览:84
android系统运行动态编译的程序 浏览:419
计算编程中常用的if语句是 浏览:736
linux文件夹权限乱了 浏览:910
程序员职业病预防保健操 浏览:680
c程序修改后需不需要重新编译 浏览:725
怎样把图片分别放置在文件夹中 浏览:873
推流服务器地址是什么 浏览:632
java允许多重继承 浏览:513
解压小玩具好玩又可爱 浏览:408
腾讯云大带宽服务器 浏览:823
加密锁的售后 浏览:268
linux登不上去 浏览:731
联想服务器休眠后如何唤醒 浏览:113
四川话女孩学习编程 浏览:324
编译原理文法区分 浏览:1001
教师可以做程序员嘛 浏览:637
终结战场安卓国际服怎么下载 浏览:155
现在的高端服务器属于什么 浏览:810