枚举类型(enum)
JDK1.5增加了枚举类型,可以使用enum来定义
例如:
public enum Gender{
MALE,FEMALE;
}
其中每一个枚举元素都是该枚举类型的一个实例,并且默认是用public static final修饰的
1)枚举类型和类的关系
把Gender.class反编译后显示如下:
public final class com.briup.test.Gender extends java.lang.Enum<com.briup.test.Gender> {
public static final com.briup.test.Gender MALE;
public static final com.briup.test.Gender FEMALE;
private static final com.briup.test.Gender[] ENUM$VALUES;
static {};
private com.briup.test.Gender(java.lang.String, int);
public static com.briup.test.Gender[] values();
public static com.briup.test.Gender valueOf(java.lang.String);
}
说明枚举类型本质还是一个类,而且默认就是fianl修饰以及默认继承父类java.lang.Enum。
同时构造器是自动生成的且是私有的,表示不可再创建对象。(使用反射也不行)
private Gender(String name,int ordinal)
name : 枚举对象的名字
ordinal: 枚举元素的编号,默认从0开始
我们在枚举中所写的MALE和FEMALE其实就是Gender类型的俩个固定的对象。(public static final)
注:enum是java中的一个关键字,Enum是java中的一个类
2)获取枚举对象
1.获得枚举对象,三种方式
枚举对象在我们使用之前就已经全部创建好了,并且不会增加或减少,和声明的时候保持一致。
例如:
Gender g1 = Gender.FEMALE;
Gender g2 = Gender.MALE;
Gender g3 = Gender.valueOf("FEMALE");
Gender g4 = Gender.valueOf("MALE");
System.out.println(g1 == g3);//true
System.out.println(g2 == g4);//true
Gender g5 = Enum.valueOf(Gender.class, "FEMALE");
Gender g6 = Enum.valueOf(Gender.class, "MALE");
System.out.println(g1 == g5);//true
System.out.println(g2 == g6);//true
2.获得一个枚举类型的所有对象
Gender[] values = Gender.values();
for(Gender g:values){
System.out.println(g);
}
3)枚举类型的方法
枚举对象默认只能调用到父类Enum中的方法以及Object中的方法
如果想调用自己的方法,也可以在枚举类型中定义出属于自己的方法.
注:枚举也是类,只是一种特殊的类而且,所以在枚举类型中可以定义很多东西,像之前在类中写代码是一样的
例如:
public enum Gender {
MALE,FEMALE;
public void say(String name){
System.out.println("hello "+name+","+this);
}
public static void main(String[] args) {
Gender g1 = Gender.FEMALE;
Gender g2 = Gender.MALE;
g1.say("tom");
g2.say("tom");
}
}
也可以定义静态方法
例如:
public enum Gender {
MALE,FEMALE;
public void say(String name){
System.out.println("hello "+name+","+this);
}
public static void run(){
System.out.println("running..");
}
public static void main(String[] args) {
Gender.run();
}
}
4)枚举类型的属性
枚举类型中可以定义属于自己的属性
例如:
public enum Gender {
MALE,FEMALE;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//重写toString方法
public String toString() {
return this.getName();
}
public static void main(String[] args) {
Gender g = Gender.FEMALE;
g.setName("女");
System.out.println(g);
}
}
5)枚举类型的构造器
在枚举类型中定义其构造器,但是必须是私有的,默认也是私有的
例如:
public enum Gender {
//默认调用无参构造器
MALE,FEMALE;
private String name;
//有参构造器
private Gender(String name){
this.name = name;
}
//无参构造器
Gender(){
}
//重写toString方法
public String toString() {
return this.name;
}
}
构造器的调用:
在声明枚举对象的时候,其实就是在调用构造器,默认是隐式调用其无参构造器,也可以显式调用有参构造器
例如:
public enum Gender {
MALE("男"),FEMALE("女");
private String name;
private Gender(String name){
this.name = name;
}
Gender(){
this("");
}
public String toString() {
return this.name;
}
public static void main(String[] args) {
Gender g = Gender.FEMALE;
System.out.println(g);
}
}
6)枚举类型的抽象方法
枚举类型中可以编写抽象方法,但是这时候其每个对象都必须去实现这个抽象方法,否则编译报错。
形式上很像匿名内部类对象
例如:
public enum Gender {
MALE(){
public void run() {
System.out.println("MALE run");
}
},FEMALE(){
public void run() {
System.out.println("FEMALE run");
}
};
public abstract void run();
}
7)枚举类型可以实现接口
枚举类型不能指定继承其他父类,但是可以实现其他接口
例如:枚举类型中把该接口中的所有方法实现了
public interface Action{
void doSomeThing();
}
public enum Gender implements Action{
MALE,FEMALE;
public void doSomeThing() {
System.out.println("Gender go..");
}
}
例如:或者在每个对象中分别实现接口中所有方法也可以
public interface Action{
void doSomeThing();
}
public enum Gender implements Action{
MALE(){
public void doSomeThing() {
System.out.println("MALE go...");
}
},FEMALE(){
public void doSomeThing() {
System.out.println("FEMALE go...");
}
};
}