枚举 java 是语法糖吗_java语法糖---枚举

在JDK5.0中提供了大量的语法糖,例如:自动装箱拆箱、增强for循环、枚举、泛型等。所谓“语法糖”就是指提供更便利的语法供程序员使用,只是在编译器上做了手脚,却没有提供对应的指令集来处理它。

下面要介绍的是枚举这个语法糖的原理。

其实enum就是一个普通的类,它继承自java.lang.Enum类。

Java代码

public enum Sex {

MALE,

FEMALE

}

Java代码

public final class Sex extends java.lang.Enum{

public static final Sex MALE;

public static final Sex FEMALE;

public static Sex[] values();

public static Sex valueOf(java.lang.String)

static {};

}

可以看出Sex编译成class文件之后,就变成发一个类,这个类是final的,所以enum是不可以被其他类继承的。由于enum已经继承了java.lang.Enum,所以enum不能再继承其他类。其中,enum中的每个枚举实例都是它自己的一个常量实例。除了这些,编译器还为我们生成了一个values方法。

下面再用DJ把这个enum的class文件反编译,看一下每个方法里面都做了些什么东西。

Java代码

public final class Sex extends Enum

{

public static Sex[] values()

{

return (Sex[])$VALUES.clone();

}

public static Sex valueOf(String s)

{

return (Sex)Enum.valueOf(Sex, s);

}

private Sex(String s, int i)

{

super(s, i);

}

public static final Sex MALE;

public static final Sex FEMALE;

private static final Sex $VALUES[];

static

{

MALE = new Sex("MALE", 0);

FEMALE = new Sex("FEMALE", 1);

$VALUES = (new Sex[] {

MALE, FEMALE

});

}

}

在static块中初始化了两个enum实例,Sex枚举的构造方法有两个参数,第一个参数是枚举实例的名字,第二个参数是序列号(用ordinal方法可以获取到)。

我们还可以向每个枚举实例添加方法。

Java代码

public enum Sex {

MALE {

public String toString() {

return "我是男人";

}

},

FEMALE {

public String toString() {

return "我是女人";

}

};

}

那这种情况下,编译器又为我们做了些什么动作呢?编译这个文件之后,我们可以看到生成了三个class文件,分别是Sex.class、Sex$1.class、Sex$2.class。它们分别是些什么东东,别急,我们用“神器”DJ打开这些文件来看一下。

Java代码

public class Sex extends Enum

{

public static Sex[] values()

{

return (Sex[])$VALUES.clone();

}

public static Sex valueOf(String s)

{

return (Sex)Enum.valueOf(Sex, s);

}

private Sex(String s, int i)

{

super(s, i);

}

public static void main(String args[])

{

}

public static final Sex MALE;

public static final Sex FEMALE;

private static final Sex $VALUES[];

static

{

MALE = new Sex("MALE", 0) {

public String toString()

{

return "\u6211\u662F\u7537\u4EBA";

}

}

;

FEMALE = new Sex("FEMALE", 1) {

public String toString()

{

return "\u6211\u662F\u5973\u4EBA";

}

}

;

$VALUES = (new Sex[] {

MALE, FEMALE

});

}

}

跟上面生成的class文件差不多,只是在static块中两个枚举实例的初始化变成了匿名内部类(这也就是为什么会多了两个class文件的原因了,^_^),在每个匿名内部类都有一个toString方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值