枚举类型定义:使用enum关键字,隐含了所创建的类是java.lang.Enum类的子类(java.lang.enum类是一个抽象类)
public enum Size{SMALL,MEDIUM,LARGE,EXTRA_LARGE};
实际上该定义声明的是一个类,刚好有4个实例
枚举类型符合通用模式:
Class Enum
,其中E表示枚举类型的名称>
枚举类型的每一个值都将被映射到protected Enum(String name,int ordinal);构造函数中,每个值都被转换成一个字符串,并且序数设置表示了被创建的顺序
eg.如上声明,实际上调用了4次Enum(String name,int ordinal):
new Enum("SMALL",0);
new Enum("MEDIUM",1);
new Enum("LARGE",2);
new Enum("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
getDeclaringClass()
返回与此枚举常量的枚举类型相对应的 Class 对象。
3.String name()
返回此枚举常量的名称,在其枚举声明中对其进行声明。
4.int ordinal()
返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。
5.static
> T valueOf(Class enumType, String name)
返回带指定名称的指定枚举类型的枚举常量。
6.static Enum valueOf(Class enumClass,String name)
返回指定名字、给定类的枚举常量
7.枚举类型的静态values(),返货包含全部枚举值的数组
Size[] values = Size.values();
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.