java枚举类型
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枚举类型的更多相关文章
- java 枚举类型分析
最近做android开发,需要用到枚举值,这样可以连续赋值,我按之前c++那样书写,如下所示: public enum ColorSelect { RED_BAGE = 0, GREEN_BAGE, ...
- 【转】java枚举类型enum的使用
原文网址:http://blog.csdn.net/wgw335363240/article/details/6359614 java 枚举类型enum 的使用 最近跟同事讨论问题的时候,突然同事提到 ...
- 【转】掌握java枚举类型(enum type)
原文网址:http://iaiai.iteye.com/blog/1843553 1 背景 在java语言中还没有引入枚举类型之前,表示枚举类型的常用模式是声明一组具有int常量.之前我们通常利用 ...
- 转载 java枚举类型enum的使用 (原文地址:http://blog.csdn.net/wgw335363240/article/details/6359614)
java枚举类型enum的使用 最近跟同事讨论问题的时候,突然同事提到我们为什么java中定义的常量值不采用enmu枚举类型,而采用public final static 类型来定义呢?以前我们都是采 ...
- Java 枚举类型简介
目录 Java 枚举示例 Java 枚举构造函数 枚举类型是用于定义常量集合的特殊类型,更确切的说,JAVA枚举类型是一种特殊的 java 类.枚举类型可以包含常量.方法等.在 java5 中添加了 ...
- 【转载】Java枚举类型的使用
枚举类型概念 package com.lxq.enumm; public class EnumDemoOne { private enum InnerEnum { RED, GREEN, YELLOW ...
- 深入理解Java枚举类型(enum)
https://blog.csdn.net/javazejian/article/details/71333103 深入理解Java类型信息(Class对象)与反射机制 深入理解Java枚举类型(en ...
- Java枚举类型使用示例
Java枚举类型使用示例 学习了:https://www.cnblogs.com/zhaoyanjun/p/5659811.html http://blog.csdn.net/qq_27093465/ ...
- Java枚举类型的使用,数值的二进制表示
一.Java枚举类型的使用 首先请看这段代码: package java上课; public class EnumTest { public static void main(String[] arg ...
- java 枚举类型知识点记录
在日常开发中,我们常用接口装常量或者在类里面写静态常量,java1.5以后加入了枚举类型enum.枚举类型是由一组固定的常量组成的类型.枚举本质是int值.因为枚举类型没有可以访问的构造器,所以枚举类 ...
随机推荐
- dos脚本2
一.简单批处理内部命令简介 1.Echo 命令 打开回显或关闭请求回显功能,或显示消息.如果没有任何参数,echo 命令将显示当 前回显设置. 语法 echo [{on off}] [mess ...
- python爬虫解析页面数据的三种方式
re模块 re.S表示匹配单行 re.M表示匹配多行 使用re模块提取图片url,下载所有糗事百科中的图片 普通版 import requests import re import os if not ...
- Web.xml详解分析
一.首先了解项目加载的优先级 首先可以肯定的是,加载顺序与它们在 web.xml 文件中的先后顺序无关.即不会因为 filter 写在 listener 的前面而会先加载 filter. 最终得出的结 ...
- springdata笔记2
SpringData整合hibernate CRUD操作: pom.xml <?xml version="1.0" encoding="UTF-8"?&g ...
- CSS3 实现圆形、椭圆形、三角形等各种形状样式
CSS3 圆形 #css3-circle{ width: 150px; height: 150px; border-radius: 50%; background-color: #232323;} C ...
- java Scanner中next和nextLine()区别
next(): 1.一定要读取到有效字符后才可以结束输入. 2.对输入有效字符之前遇到的空白,next() 方法会自动将其去掉. 3.只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符. ne ...
- Spring各个jar包作用
Spring AOP:Spring的面向切面编程,提供AOP(面向切面编程)的实现Spring Aspects:Spring提供的对AspectJ框架的整合Spring Beans:Spring IO ...
- Django学习笔记之模板
模板 模板介绍 在之前的章节中,视图函数只是直接返回文本,而在实际生产环境中其实很少这样用,因为实际的页面大多是带有样式的HTML代码,这可以让浏览器渲染出非常漂亮的页面. 目前市面上有非常多的模板系 ...
- 哈密顿绕行世界问题、n皇后问题
哈密顿绕行世界问题 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- php最常见最经典的算法题
1.一群猴子排成一圈,按1,2,…,n依次编号.然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去…,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫 ...