jvm并不支持枚举类型,java中枚举类型是在编译器层面上实现的,先看如下代码:

package demo.nio;

public class EnumDemo {

    public static enum Color{
Red(20),
Green(10),
Blue(30); Color(int v){
this.value = v;
} private int value;
public int getValue(){
return this.value;
}
} public static void main(String[] args) {
System.out.println(Color.class.getSuperclass());
} }

输出结果:class java.lang.Enum

也就是说所有的枚举类型都是 java.lang.Enum的直接子类,java.lang.Enum是个抽象类,内部两个字段,ordinal和name,代码如下:

package java.lang;

import java.io.Serializable;
import java.io.IOException;
import java.io.InvalidObjectException;
import java.io.ObjectInputStream;
import java.io.ObjectStreamException; public abstract class Enum<E extends Enum<E>> implements Comparable<E>, Serializable { private final String name; public final String name() {
return name;
} private final int ordinal; public final int ordinal() {
return ordinal;
} protected Enum(String name, int ordinal) {
this.name = name;
this.ordinal = ordinal;
} public String toString() {
return name;
} public final boolean equals(Object other) {
return this==other;
} public final int hashCode() {
return super.hashCode();
} protected final Object clone() throws CloneNotSupportedException {
throw new CloneNotSupportedException();
} public final int compareTo(E o) {
Enum other = (Enum)o;
Enum self = this;
if (self.getClass() != other.getClass() &&self.getDeclaringClass() != other.getDeclaringClass())
throw new ClassCastException();
return self.ordinal - other.ordinal;
} public final Class<E> getDeclaringClass() {
Class clazz = getClass();
Class zuper = clazz.getSuperclass();
return (zuper == Enum.class) ? clazz : zuper;
} public static <T extends Enum<T>> T valueOf(Class<T> enumType,String name) {
T result = enumType.enumConstantDirectory().get(name);
if (result != null)
return result;
if (name == null)
throw new NullPointerException("Name is null");
throw new IllegalArgumentException(
"No enum constant " + enumType.getCanonicalName() + "." + name);
} protected final void finalize() { } private void readObject(ObjectInputStream in) throws IOException,ClassNotFoundException {
throw new InvalidObjectException("can't deserialize enum");
} private void readObjectNoData() throws ObjectStreamException {
throw new InvalidObjectException("can't deserialize enum");
}
}

从代码可以看出,此类不可以实例化。compareTo,是ordinal的比较。一个枚举类型的实现就相当于如下代码:

public class Color extends java.lang.Enum{
public static Color Red = new Color("Red",0);
public static Color Green = new Color("Green",1);
public static Color Blue = new Color("Blue",2);
public Color(String name,int ordinal){
super(name,ordinal);
}
}

当时编译器并不允许这样显示定义,当时用法是完全是上述定义相符合的

public static void main(String[] args) {
System.out.println(Color.class.getSuperclass());
System.out.println(Color.Blue.ordinal());
System.out.println(Color.Blue.name());
}

输出结果:

class java.lang.Enum
2
Blue

如果枚举中包含字段和方法,方法和容易理解,只要是该类型的对象都可以调用该方法,字段和字段的初始化也并不复杂,假如枚举中包含一个int型的value。如上面的Color定义:

public class Color extends java.lang.Enum{
public static Color Red = new Color("Red",0);
public static Color Green = new Color("Green",1);
public static Color Blue = new Color("Blue",2);
public Color(String name,int ordinal){
super(name,ordinal);
} public Color(String name,int ordinal,int value){
super(name,ordinal);
this.value = value;
} public int value;
}

除此之外,Color还包含了一些静态方法,valueOf用于根据名称获取该对象,values获取所有该类型的对象示例如下:

public static void main(String[] args) {
System.out.println(Color.class.getSuperclass());
for(Color c:Color.values()){
System.out.println(c.name());
}
System.out.println(Color.valueOf("Blue"));
System.out.println(Enum.valueOf(Color.class,"Blue"));
}

输出结果如下:

class java.lang.Enum
Red
Green
Blue
Blue
Blue

java枚举类型的更多相关文章

  1. java 枚举类型分析

    最近做android开发,需要用到枚举值,这样可以连续赋值,我按之前c++那样书写,如下所示: public enum ColorSelect { RED_BAGE = 0, GREEN_BAGE, ...

  2. 【转】java枚举类型enum的使用

    原文网址:http://blog.csdn.net/wgw335363240/article/details/6359614 java 枚举类型enum 的使用 最近跟同事讨论问题的时候,突然同事提到 ...

  3. 【转】掌握java枚举类型(enum type)

    原文网址:http://iaiai.iteye.com/blog/1843553 1   背景 在java语言中还没有引入枚举类型之前,表示枚举类型的常用模式是声明一组具有int常量.之前我们通常利用 ...

  4. 转载 java枚举类型enum的使用 (原文地址:http://blog.csdn.net/wgw335363240/article/details/6359614)

    java枚举类型enum的使用 最近跟同事讨论问题的时候,突然同事提到我们为什么java中定义的常量值不采用enmu枚举类型,而采用public final static 类型来定义呢?以前我们都是采 ...

  5. Java 枚举类型简介

    目录 Java 枚举示例 Java 枚举构造函数 枚举类型是用于定义常量集合的特殊类型,更确切的说,JAVA枚举类型是一种特殊的 java 类.枚举类型可以包含常量.方法等.在 java5 中添加了 ...

  6. 【转载】Java枚举类型的使用

    枚举类型概念 package com.lxq.enumm; public class EnumDemoOne { private enum InnerEnum { RED, GREEN, YELLOW ...

  7. 深入理解Java枚举类型(enum)

    https://blog.csdn.net/javazejian/article/details/71333103 深入理解Java类型信息(Class对象)与反射机制 深入理解Java枚举类型(en ...

  8. Java枚举类型使用示例

    Java枚举类型使用示例 学习了:https://www.cnblogs.com/zhaoyanjun/p/5659811.html http://blog.csdn.net/qq_27093465/ ...

  9. Java枚举类型的使用,数值的二进制表示

    一.Java枚举类型的使用 首先请看这段代码: package java上课; public class EnumTest { public static void main(String[] arg ...

  10. java 枚举类型知识点记录

    在日常开发中,我们常用接口装常量或者在类里面写静态常量,java1.5以后加入了枚举类型enum.枚举类型是由一组固定的常量组成的类型.枚举本质是int值.因为枚举类型没有可以访问的构造器,所以枚举类 ...

随机推荐

  1. dos脚本2

    一.简单批处理内部命令简介  1.Echo 命令  打开回显或关闭请求回显功能,或显示消息.如果没有任何参数,echo 命令将显示当 前回显设置.  语法  echo [{on off}] [mess ...

  2. python爬虫解析页面数据的三种方式

    re模块 re.S表示匹配单行 re.M表示匹配多行 使用re模块提取图片url,下载所有糗事百科中的图片 普通版 import requests import re import os if not ...

  3. Web.xml详解分析

    一.首先了解项目加载的优先级 首先可以肯定的是,加载顺序与它们在 web.xml 文件中的先后顺序无关.即不会因为 filter 写在 listener 的前面而会先加载 filter. 最终得出的结 ...

  4. springdata笔记2

    SpringData整合hibernate CRUD操作: pom.xml <?xml version="1.0" encoding="UTF-8"?&g ...

  5. CSS3 实现圆形、椭圆形、三角形等各种形状样式

    CSS3 圆形 #css3-circle{ width: 150px; height: 150px; border-radius: 50%; background-color: #232323;} C ...

  6. java Scanner中next和nextLine()区别

    next(): 1.一定要读取到有效字符后才可以结束输入. 2.对输入有效字符之前遇到的空白,next() 方法会自动将其去掉. 3.只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符. ne ...

  7. Spring各个jar包作用

    Spring AOP:Spring的面向切面编程,提供AOP(面向切面编程)的实现Spring Aspects:Spring提供的对AspectJ框架的整合Spring Beans:Spring IO ...

  8. Django学习笔记之模板

    模板 模板介绍 在之前的章节中,视图函数只是直接返回文本,而在实际生产环境中其实很少这样用,因为实际的页面大多是带有样式的HTML代码,这可以让浏览器渲染出非常漂亮的页面. 目前市面上有非常多的模板系 ...

  9. 哈密顿绕行世界问题、n皇后问题

    哈密顿绕行世界问题 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  10. php最常见最经典的算法题

    1.一群猴子排成一圈,按1,2,…,n依次编号.然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去…,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫 ...