黑马程序员技术交流社区
标题:
我对枚举类的总结,欢迎吐槽
[打印本页]
作者:
homeless
时间:
2014-3-5 22:27
标题:
我对枚举类的总结,欢迎吐槽
当一个类的实例个数有限,并且固定,这时就可以用枚举。它和在接口里定义的常量差不多。
比如
interface week{
public static final int MON=1;
public static final int TUE=2;
...........
}
和
enum Week{
MON,TUE,...SUN;
}
区别在于,接口中的是常量,用整数来区别一周内的七天。而枚举用的是对象,并且提供相应的方法。
1.枚举它继承java.lang.enum类,而不是上帝object,并且该类实现了Serializable接口和comparable接口,所以肯定有compareTo(E)方法。
2.非抽象的枚举类默认使用final修饰,不能派生子类。如果枚举类内部有抽象方法,该类默认用abstract修饰,抽象方法用匿名子类对象实现(可不可以派生子类不清楚,如果你验证了,请告诉我)。
3.构造函数用并且只能用private修饰
4.因为枚举类的实例都是既定的,所以这些实例对象被规定只能显式全部的罗列在{}的第一行,这些实例被默认的public static final修饰。这些对象在罗列时,就相当于调用了对应的构造函数(这里的week就调用了7次),比如 第一个实例MON相当于public static final Week MON=new Week()。
如果定义了带参数的构造函数,罗列时也要相应的标明参数-------MON(“Monday”),TUE(“Tuesday”),...SUN(“Sunday”);--------
这里的MON(“Monday”)就相当于public static final Week MON=new Week(“Monday”);
使用他们时,用 类名.实例名 的方式获取他们。
5.附带的方法有 String name()返回实例的名字
String toString()和name()差不多;int ordinal()返回索引值,0开头;static values()返回该枚举的所有实例
static valueOf(Week.class,"SUN")返回字符串SUN对应的实例名
6.如果枚举类实现了接口,比如 interface MSG{void showInfo();}在枚举类里实现showInfo()时,他的每一个实例都会对应相同的方法体,因此
用匿名子类来具体化
enum Week implements MSG
{
MON{
public void showInfo(){System.out.println("今天是周一,要上班了"); }
},
TUE{
public void showInfo(){System.out.println("周二了,还有四天才放假"); }
},
...,
SUN{
public void showInfo(){ System.out.println("今天是周末,明天又要上班了"); }
};
}
作者:
行如止水
时间:
2014-3-6 01:06
顶一个,总结的不错,特别是第二条和第三条;
作者:
asvsass
时间:
2014-3-6 01:49
枚举类 默认是final ? 这个我还没注意
作者:
ixiangfeng
时间:
2014-3-6 09:15
第一条就有问题了 java.lang.enum 类名不都是大写的吗? enum 只是一个关键字 枚举类是继承java.lang.Enum类
而java.lang.Enum类又继承自java.lang.Object类 简单来说枚举类是间接地继承Object类
作者:
ixiangfeng
时间:
2014-3-6 09:23
第四条:这些对象在罗列时,就相当于调用了对应的构造函数(这里的week就调用了7次)
应该要在加载这个枚举类时才会调用吧 假如定义了一个WeekDay枚举类 然后枚举类定义一个WeekDay weekday;变量,这时是不会调用构造函数的,要WeekDay weekday = WeekDay.MON;这样才会调用构造函数
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2