反编译了一个文件,得到如下代码:
public final class Gender extends Enum
{
public static final Gender Male;
public static final Gender Female;
public static final Gender Unknown;
private static final Gender $VALUES[];
public static Gender[] values()
{
return (Gender[])$VALUES.clone();
}
public static Gender valueOf(String s)
{
return (Gender)Enum.valueOf(Gender, s);
}
private Gender(String s, int i)
{
super(s, i);
}
static
{
Male = new Gender("Male", 0);
Female = new Gender("Female", 1);
Unknown = new Gender("Unknown", 2);
$VALUES = (new Gender[] {
Male, Female, Unknown
});
}
}
再用这个类重新编译的时候,发生了语法错误,说 Enum 不能被直接继承。 classes cannot directly extends java.lang.Enum 这样的错误提示。
搞晕了。 通过各种手段, Goolge 到如下这篇文章,才得以释然。
于是乎,写了几句话:
public enum Gender
{
Male,
Female,
Unknown;
}
编译成class 文件,再反编译回来,果真得到了文章开始的文件。
网上的这篇文章如下:
http://blog.csdn.net/meng72ndsc/article/details/5824434
1、创建一个枚举类
EnumDemo.java
public enum EnumDemo {
}
2、我们来猜测一下这个枚举类?
2.1、查看它的字节码文件
Compiled from "EnumDemo.java"
public final class EnumDemo extends java.lang.Enum{
public static EnumDemo[] values();
public static EnumDemo valueOf(java.lang.String);
static {};
}
final keyword:表明一个枚举类是一个终止(final)类,说明它不能作为父类,也就是说它没有子类,还说明它不能是一个抽象类。
extends keyword:表明一个枚举类默认就是继承自java.lang.Enum,是它的子类,由于java类只能是单继承,所以我们不能再自己写一个extends来继承自其它的某一个 类。
两个静态的方法:values():它的返回类型是EnumDemo[], 返回一个包含全部枚举值的数组。
valueOf(java.lang.String):这个方法和toString方法是相对应的,返回带指定名称的指定枚举类型的枚举常量。
静态块:static{},当枚举类被调用的时候就将静态块里面的东西加载到内存。
2.2、枚举能实现某一个接口吗?
Machine.java
public interface Machine {
void run();
}
SubClass.java
public enum SubClass implements Machine {
;
public void run() {
}
}
编译能通过。
再来看一下SubClass.java的字节码内容:
Compiled from "SubClass.java"
public final class SubClass extends java.lang.Enum implements Machine{
public static SubClass[] values();
public static SubClass valueOf(java.lang.String);
public void run();
static {};
}
很有意思的是:在SubClass.java中有一个不起眼的分号";",别看它不起眼,如果你不写这个分号就会出现错误,";"代表着枚举值的声明完毕。那么什么叫做枚举值呢?
枚举值:
public enum SubClass implements Machine {
A, B("HELLO WORLD"), C;
private SubClass() {
}
private SubClass(String s) {
}
public void run() {
}
}
它的字节码文件:
Compiled from "SubClass.java"
public final class SubClass extends java.lang.Enum implements Machine{
public static final SubClass A;
public static final SubClass B;
public static final SubClass C;
public static SubClass[] values();
public static SubClass valueOf(java.lang.String);
public void run();
static {};
}
这会儿知道为什么A,B,C要大写了吧?
在这个枚举类当中,A 和B("HELLO WORD") 和 C 都是枚举值。它们之所以能产生,是因为有相对应的构造函数的缘故,如果你不相信,那么你可以将任意一个构造函 数删除,试一下。我们要学会成为破坏高手,现在我将private SubClass(){}删除,对了,在枚举里面的构造方法必须是私有的,但是我试了以下,默认的也行,不知道是谁说的必须是私有的,但是大家都是这样做 的,我也就这样说了。我们还是回到正题:
错误:找不到符号
符号:构造函数SubClass()
位置:类SubClass
好了,就说到这里,下面我来完整的体验一下,看看会出现一些什么问题:
分享到:
相关推荐
java 通过反射获取枚举类,及枚举类的值,枚举类枚举实例名。本项目为普通java项目
Java SE程序 Enum枚举类Java SE程序 Enum枚举类Java SE程序 Enum枚举类Java SE程序 Enum枚举类Java SE程序 Enum枚举类Java SE程序 Enum枚举类Java SE程序 Enum枚举类Java SE程序 Enum枚举类Java SE程序 Enum枚举类...
java高级编程 Enum枚举 包括枚举的例子,问题 及一些文档,是复习的好资源
我想几乎每一个学习Java语言的人在学习枚举的时候首先的一个疑问就是“为什么不用static final字段替代?”,有这个疑问就说明你已经摸索到了枚举类型的最主要功能......
java枚举小例子,简单了解枚举的用法,适合初学者使用。
java枚举结果类、根据状态值获取枚举值 Controller: /** 模块类型枚举 */ model.addAttribute("mType", ModuleTypeEnum.ModuleTypeShow()); ftl: value="${mType.key}:${mType.value}” </#list>
Java1.5提供了关键字enum,能够通过该关键字方便得定义自己须要的枚举类型,比方 enum Season { SPRING, SUMMER, AUTUMN, WINTER } 定义了一个季节枚举类型。 在本例中,对于Season.SPRING这个...
主要介绍了Java手动方式创建枚举类,结合实例形式分析了java创建枚举类的方法及相关操作技巧,需要的朋友可以参考下
java中enum枚举的详细用法。 0.0
列举java 枚举相关信息列举java 枚举相关信息列举java 枚举相关信息 列举java 枚举相关信息 列举java 枚举相关信息 列举java 枚举相关信息 列举java 枚举相关信息
使用JDK1.6编写的枚举例子,里面有详细的注释,很有必要参考下
java基础,反射枚举基础,自己总结的笔记。
JAVA枚举JAVA枚举
讲述了java中的枚举类型的用法,深入枚举类型
java 枚举ppt 枚举定义 用普通类模拟枚举 带构造方法的枚举 带抽象方法的枚举 单例与枚举 枚举与类集
java 课件 数组、枚举及注解 java 课件 数组、枚举及注解 java 课件 数组、枚举及注解 java 课件 数组、枚举及注解
java枚举状态机
Java高新技术_java5的枚举的基本应用
【Java面试】枚举从使用到原理
简单总结java枚举类型,适合java初学者