Enum枚举常量

来源:互联网 发布:千锋大数据视频教程 编辑:程序博客网 时间:2024/05/22 14:45

枚举类型定义:使用enum关键字,隐含了所创建的类是java.lang.Enum类的子类(java.lang.enum类是一个抽象类)

public enum Size{SMALL,MEDIUM,LARGE,EXTRA_LARGE};
实际上该定义声明的是一个,刚好有4个实例

枚举类型符合通用模式: Class Enum<E extends<Enum E>>,其中E表示枚举类型的名称
枚举类型的每一个值都将被映射到protected Enum(String name,int ordinal);构造函数中,每个值都被转换成一个字符串,并且序数设置表示了被创建的顺序
eg.如上声明,实际上调用了4次Enum(String name,int ordinal):

new Enum<Size>("SMALL",0);new Enum<Size>("MEDIUM",1);new Enum<Size>("LARGE",2);new Enum<Size>("EXTRA_LARGE",3);

可以在枚举类型中添加一些构造器、方法和域。构造器只在构造枚举常量的时候被调用

public enum Size{    SMALL("S"),MEDIUM("M"),LARGE("L"),EXTRA_LARGE("XL");    private String abbreviation;    private Size(String abbreviation){        this.abbreviation = abbreviation;    }    public String getAbbreviation(){        return abbreviation;    }}

SMALL(“S”),MEDIUM(“M”),LARGE(“L”),EXTRA_LARGE(“XL”);
1.如上是Size的构造函数,不能通过new语句调用,但可以在声明常量的时候进行调用,只需要常量后面加括号并且传递参数进去
2.不同的常量对象就有了不同的属性值,并且存放在字段abbreviation中
3.此外还定义了方法,在获得某个常量引用后就可以调用getAbbreviation()方法

枚举类的构造方法只能是private
比较两个枚举类型的值时,永远不需要调用equals,而直接使用==
获取枚举类型中的常量:枚举名.常量
枚举类型中的每个值都是一个对象


方法:
1.int compareTo(E other)
比较此枚举与指定对象的顺序。
2.Class<E> getDeclaringClass()
返回与此枚举常量的枚举类型相对应的 Class 对象。
3.String name()
返回此枚举常量的名称,在其枚举声明中对其进行声明。
4.int ordinal()
返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。
5.static <T extends Enum<T>> T valueOf(Class<T> enumType, String name)
返回带指定名称的指定枚举类型的枚举常量。
6.static Enum valueOf(Class enumClass,String name)
返回指定名字、给定类的枚举常量
7.枚举类型的静态values(),返货包含全部枚举值的数组
Size[] values = Size.values();



迅雷 Java选择题
What is the result of the following code?

enum AccountType{    SAVING,FIXED,CURRENT;    private AccountType(){        System.out.println("It is a account type.");    }}class Enumone{    public static void main(String[] args){        System.out.println(AccountType.FIXED);    }}

Answer:输出结果如下
It is a account type.
It is a account type.
It is a account type.
FIXED
解析:

1.枚举类在后台实现时,实际上是转化为一个继承了java.lang.Enum类的实体类,原先的枚举类型变为对应的实体类型

AccountType变成了个class AccountType

2.并且会生成一个新的构造函数,若原来有构造函数,则在此基础上添加两个参数,生成新的构造函数

private AccountType(){        System.out.println("It is a account type.");    }

变成:

private AccountType(String s,int i){    super(s,i);    System.out.println("It is a account type.");}

而且在该类中,会添加若干字段来代表具体的枚举类型:

public static final AccountType SAVING;public static final AccountType FIXED;public static final AccountType CURRENT;

而且会添加一段static代码段:

static{    SAVING = new AccountType("SAVING",0);    FIXED = new AccountType("FIXED",1);    CURRENT = new AccountType("CURRENT",2);    $VALUES = new AccountType[]{SAVING,FIXED,CURRENT};}

以此来初始化枚举类中的每一个具体类型。
在初始化过程中new AccountType构造函数被调用了三次,所以打印三次It is a account type.

原创粉丝点击