了解枚举

为了了解枚举,先利用反射分析一下它
import java.lang.reflect.*;

//定义枚举
enum Car {
FORD,NISSION,BMW
}

public class EnumAnalyze {

public static void main(String[] args) {
System.out.println("Superclass:");
System.out.println(Car.class.getGenericSuperclass());
System.out.println("Interfaces:");
for (Type t : Car.class.getGenericInterfaces())
System.out.println(t);
System.out.println("Fields:");
for (Field f : Car.class.getFields())
System.out.println(f);
System.out.println("Methods:");
for (Method m : Car.class.getDeclaredMethods())
System.out.println(m);
}

}
/*输出如下
Superclass:
java.lang.Enum<Car>
Interfaces:
Fields:
public static final Car Car.FORD
public static final Car Car.NISSION
public static final Car Car.BMW
Methods:
public static Car[] Car.values()
public static Car Car.valueOf(java.lang.String)
*/

通过上面的输出,可以推出枚举代码(当然也可以通过使用javap反编译enum Car)
下面的代码可以让我们很清楚地了解枚举

final class Car extends java.lang.Enum {
public static final Car FORD;
public static final Car NISSION;
public static final Car BMW;
public static Car[] values();
public static Car valueOf(java.lang.String);
}

上面values()和valueOf(java.lang.String)方法是由编译器添加的,再分析一下java.lang.Enum类确定这两个方法不是Enum类的方法

import java.lang.reflect.*;

public class EnumAnalyze {

public static void main(String[] args) {
for (Method m : java.lang.Enum.class.getDeclaredMethods())
System.out.println(m);
}

}
/*输出如下
public final java.lang.String java.lang.Enum.name()
protected final void java.lang.Enum.finalize()
public final boolean java.lang.Enum.equals(java.lang.Object)
public java.lang.String java.lang.Enum.toString()
public final int java.lang.Enum.hashCode()
protected final java.lang.Object java.lang.Enum.clone() throws java.lang.CloneNotSupportedException
public final int java.lang.Enum.compareTo(java.lang.Enum)
public int java.lang.Enum.compareTo(java.lang.Object)
public static java.lang.Enum java.lang.Enum.valueOf(java.lang.Class,java.lang.String)
public final java.lang.Class java.lang.Enum.getDeclaringClass()
private void java.lang.Enum.readObject(java.io.ObjectInputStream) throws java.io.IOException,java.lang.ClassNotFoundException
public final int java.lang.Enum.ordinal()
private void java.lang.Enum.readObjectNoData() throws java.io.ObjectStreamException
*/

枚举可以有自己的属性和方法(也可以把main方法写在Car里面),还可以实现多态
enum Car {
FORD,NISSION,BMW;
int door;
static int wheel;
final void run() {
System.out.println(this.name() + " is running.");
}
}
public class EnumAnalyze {

public static void main(String[] args) {
Car.FORD.door = 2;
System.out.println(Car.BMW.door);
Car.FORD.wheel = 4;
System.out.println(Car.BMW.wheel);
for (Car c : Car.values())
c.run();
}

}
/*输出如下
0
4
FORD is running.
NISSION is running.
BMW is running.
*/

定义构造器(注意构造器要用private修饰符)
enum Car {
FORD,NISSION(4),BMW(2);

private Car() {}
private Car(int door) {
this.door = door;
}

private int door;
public int getDoor() {
return door;
}
}
public class EnumAnalyze {

public static void main(String[] args) {
System.out.println(Car.FORD.getDoor());
System.out.println(Car.NISSION.getDoor());
System.out.println(Car.BMW.getDoor());
}

}
/*输出如下
0
4
2
*/

枚举还可以重写方法
enum Car {
FORD ,
NISSION,
BMW {
void stop() {System.out.println("Override method");}
};

void stop() {
System.out.println("Default method");
}
}
public class EnumAnalyze {

public static void main(String[] args) {
Car.FORD.stop();
Car.NISSION.stop();
Car.BMW.stop();
}

}
/*输出如下
Default method
Default method
Override method
*/

再介绍枚举的几个常用方法
values() //返回所有枚举
name() //返回枚举名
toString() //返回枚举名
ordinal() //返回枚举的位置,从0开始
equals(Enum) //判断是否是同一个枚举
compareTo() //返回枚举的位置差距
valueOf(String) //返回指定的枚举,如果不存在指定的枚举则抛java.lang.IllegalArgumentException异常
valueOf(Class, String) //返回指定枚举类中指定的枚举,如果不存在指定的枚举则抛java.lang.IllegalArgumentException异常
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值