1 Enum枚举
1.1 什么是枚举
- 在数学和计算机理论,枚举是一个有穷集列出所有成员的程序,是一种特殊的数据类型的对象的计数,作用是创建固有对象,保证对象不被用户更改。
- 是jdk1.5新加的新特性,Java.lang,enum是所有枚举的基类;
- 刚一看到枚举的时候定义,当时觉得很懵逼,网上看了很多的资料才对枚举有了一定的理解,枚举实际上就是一个常量对象,相对于使用public static final 来定义常量,enum 并没有优势,真正具有优势的是enum 提供了对常量对象处理的方法;
- 通常使用在一些固定不用改变的范畴例如:一年有12个月,一周有7天等
1.2 通常常量对象定义方式
- 写得有点复杂,为了后面能更好的理解enum枚举
public class Test14 {
public static void main(String[] args) {
System.out.println(weeks.FRI);
}
}
class weeks{
//MON,TUE,WED,THU,FRI,SAT,SUN
//定义常量对象,以星期为例
private String week;
private weeks(String week){
this.week=week;
};
//定义常量对象,以星期为例
public static final weeks MON=new weeks("MON");
public static final weeks TUE=new weeks("TUE");
public static final weeks WED=new weeks("WED");
public static final weeks THU=new weeks("THU");
public static final weeks FRI=new weeks("FRI");
public static final weeks SAT=new weeks("SAT");
public static final weeks SUN=new weeks("SUN");
//重写toString方法
@Override
public String toString() {
return week;
}
}
1.3 enum的格式
- 修饰符 关键字 枚举名
- 定义多个枚举的时候要以分号结束
- 构造方法私有化
- 定义一个星期的枚举
public class Test13 {
public static void main(String[] args) {
System.out.println(week.FRI);
}
}
enum week{
MON,TUE,WED,THU,FRI,SAT,SUN
}
这样看起来是不是很很简便,也可以增加一些形式参数
public class Test13 {
public static void main(String[] args) {
System.out.println(week.FRI);
}
}
enum week{
MON("星期一","Monday"),TUE("星期二","Tuesday"),WED("星期三","Wednesday"),THU("星期四","Thursday"),FRI("星期五","Friday"),SAT("星期六","Saturday"),SUN("星期七","Sunday");
private String ChineseWeek;
private String EnglishWeek;
private week(String ChineseWeek ,String EnglishWeek ){
this.ChineseWeek=ChineseWeek;
this.EnglishWeek=EnglishWeek;
}
@Override
public String toString() {
return "week{" +
"ChineseWeek='" + ChineseWeek + '\'' +
", EnglishWeek='" + EnglishWeek + '\'' +
'}';
}
}
1.4 enum的方法
- values()返回的是枚举类型的数组;
- valueof()把传入的字符串转化为枚举对象,传入的字符串必须是枚举的名字不然会报错
- ordinal()获取枚举所在的索引
- name()获取枚举的常量的名称
- compareTo()比较枚举索引的大小
举例:
public class Test13 {
public static void main(String[] args) {
//获取一个关于week枚举的数据
week[] values = week.values();
for (week weeks:values) {
//打印week的名字
System.out.println(weeks.name());
//打印枚举对象属性
System.out.println(weeks.toString());
//获取每一个枚举元素的索引
System.out.println(weeks.ordinal());
}
System.out.println("===================================");
//把字符串MON转换成一个枚举常量对象
week mon = week.valueOf("MON");
//打印这个对象
System.out.println(mon);
System.out.println("===================================");
//比较这个2个元素的索引的大小
int i = week.SUN.compareTo(week.MON);
System.out.println(i);
}
}
enum week{
MON("星期一","Monday"),TUE("星期二","Tuesday"),WED("星期三","Wednesday"),THU("星期四","Thursday"),FRI("星期五","Friday"),SAT("星期六","Saturday"),SUN("星期七","Sunday");
private String ChineseWeek;
private String EnglishWeek;
private week(String ChineseWeek ,String EnglishWeek ){
this.ChineseWeek=ChineseWeek;
this.EnglishWeek=EnglishWeek;
}
@Override
public String toString() {
return "week{" +
"ChineseWeek='" + ChineseWeek + '\'' +
", EnglishWeek='" + EnglishWeek + '\'' +
'}';
}
}
1.5 枚举类实现接口
- 枚举类不能继承其他类,因为已经继承了所有枚举的基类java.lang.enum,但是可以实现接口
public class Test13 {
public static void main(String[] args) {
//调用接口实现的方法
week.SUN.getWeek();
}
}
enum week implements WeekInformation{
MON("星期一","Monday"),TUE("星期二","Tuesday"),WED("星期三","Wednesday"),THU("星期四","Thursday"),FRI("星期五","Friday"),SAT("星期六","Saturday"),SUN("星期七","Sunday");
private String ChineseWeek;
private String EnglishWeek;
private week(String ChineseWeek ,String EnglishWeek ){
this.ChineseWeek=ChineseWeek;
this.EnglishWeek=EnglishWeek;
}
@Override
public String toString() {
return "week{" +
"ChineseWeek='" + ChineseWeek + '\'' +
", EnglishWeek='" + EnglishWeek + '\'' +
'}';
}
@Override
public void getWeek(){
System.out.println("这是一个星期");
}
}
interface WeekInformation{
void getWeek();
}