`
cyber4cn
  • 浏览: 39163 次
社区版块
存档分类
最新评论

Java 中很怪异的枚举

    博客分类:
  • Java
阅读更多

反编译了一个文件,得到如下代码:

 

 

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 通过反射获取枚举类,及枚举类的值,枚举类枚举实例名

    枚举(Enumeration)是Java中的一个特殊类类型,用于定义一组常量。本项目"test-enum-demo-master"显然是一个用于演示如何通过反射来操作枚举类的示例。 首先,让我们理解枚举类的基本概念。枚举类在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 SE程序 Enum枚举类...

    JAVA高级编程中Enum枚举

    在Java编程语言中,`Enum`(枚举)是一种特殊的类类型,用于定义固定的、预定义的常量集合。它们在程序设计中扮演着重要的角色,特别是在需要表示一组固定值时,如状态、颜色、星期等。本资源包提供了一些关于`Enum`...

    Java中的“枚举类型

    ### Java中的“枚举类型”知识点详解 #### 一、引言 在Java编程语言中,枚举(Enum)作为一种特殊的类,其设计初衷是为了更好地处理一组固定不变的常量集合。相较于传统的使用`static final`字段来表示常量的做法...

    java枚举实例代码

    枚举在Java中被引入,目的是为了更好地管理和使用常量,提高代码的可读性和安全性。在本实例代码中,我们将探讨枚举的基本用法和特性。 首先,枚举的定义方式如下: ```java public enum Color { RED, GREEN, ...

    Java手动方式创建枚举类示例

    Java手动方式创建枚举类是一种常见的编程方法,在Java中可以使用枚举类型来定义一组具有相同特征的常量。通过手动方式创建枚举类,可以更好地控制枚举类型的行为和特性。在本文中,我们将通过一个实例来介绍Java手动...

    java中枚举的使用

    枚举在Java中的使用不仅提高了代码的可读性和可维护性,还避免了传统常量类的一些潜在问题,如类型安全和非法实例化。 首先,我们来看枚举的基本定义。枚举类型的声明类似于类的声明,但用关键字`enum`开头。例如:...

    说说Java中的枚举 转 可以了,够了 包括EnumSet(Map)

    Java中的枚举是一种特殊的类,它提供了一种安全的方式来表示有限集合中的值。枚举类型在Java中被引入,主要用于解决常量集合并提供一种强类型的安全性,防止了无意间创建新的实例或修改枚举常量。这篇博客将深入探讨...

    java枚举结果类、根据状态值获取枚举值

    java枚举结果类、根据状态值获取枚举值 Controller: /** 模块类型枚举 */ model.addAttribute("mType", ModuleTypeEnum.ModuleTypeShow()); ftl: value="${mType.key}:${mType.value}” </#list>

    Java中怎样由枚举常量的ordinal值获得枚举常量对象

    Java1.5提供了关键字enum,能够通过该关键字方便得定义自己须要的枚举类型,比方  enum Season {  SPRING, SUMMER, AUTUMN, WINTER  }  定义了一个季节枚举类型。  在本例中,对于Season.SPRING这个...

    java中enum枚举的详细用法

    Java中的枚举(enum)类型是在JDK 1.5版本引入的一个强大的特性,它用于定义一组相关的常量。在C/C++等语言中,枚举通常用来表示一组具有固定值的常量集合,但在Java中,枚举不仅限于此,它提供了更多的功能和灵活性...

    Java枚举类型Enum的用法

    枚举在Java中不仅是一个类,还是一种特殊的类型,允许我们定义自己的常量集合。接下来,我们将深入探讨Java枚举类型的使用方法及其相关知识点。 1. **枚举的声明与初始化** 枚举类型的声明方式类似于类,但以`enum...

    Java中的Enum枚举用法.doc

    ### Java中的Enum枚举用法详解 #### 一、引言 在Java编程语言中,枚举(Enum)是一种特殊的数据类型,它被用来表示一组固定的常量集合。相比于使用常量接口或字符串来表示固定集合,枚举提供了更加安全且易于管理的...

    在Java中使用枚举

    在Java中,枚举是一种特殊的类,用于定义一组固定的、预定义的值,这些值具有类型安全性和一些特定的功能。虽然Java在早期版本中没有直接支持枚举,但随着Java 5的发布,枚举类型被引入,以解决之前版本中的一些问题...

    Java高新技术_java5的枚举的基本应用

    在Java中,枚举可以与`switch`语句一起使用,这使得代码更加简洁且易于阅读。例如: ```java public class EnumDemo { public static void main(String[] args) { Color color = Color.RED; switch (color) { ...

    Java面试枚举从使用到原理

    在Java中,枚举可以通过`enum`关键字来创建。例如,我们可以定义一个表示一周七天的枚举类型: ```java public enum DayOfWeek { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY; } ``` 这个...

    简单总结java枚举类型

    枚举在Java中被引入为一个完整的类型,不同于C++中的枚举,这使得Java枚举更加强大且易于使用。以下是关于Java枚举类型的详细解释和相关知识点: 1. 定义枚举: 在Java中,枚举通过关键字`enum`来定义。例如,创建...

    java枚举状态机

    在Java中,通过枚举可以更安全、更易于理解和维护地实现状态机。 首先,让我们理解什么是枚举。在Java中,枚举是一种特殊的类,用于定义一组预定义的常量。这些常量代表特定的值,通常表示某种固定的集合,如颜色、...

    java枚举类型说明

    枚举类型在Java中的引入标志着一种更为类型安全且灵活的编程方式。 #### 二、Java枚举的基本概念 Java中的枚举是一种特殊的类,用于定义一组固定的常量值。相比于传统的`public static final`变量,枚举提供了更多...

    java enum 枚举 学习资料

    Java Enum 枚举学习资料是 Java 编程语言中的一种特殊类型,它主要用来实现一组固定的常量。 Enum 枚举类型是 Java 5 中引入的一种新特性,旨在解决传统的 int 枚举常量的缺陷。 1. 枚举语法 在 Java 中,枚举类型...

Global site tag (gtag.js) - Google Analytics