目录
引入:
什么是枚举:
枚举是一个被命名的整型常数的集合,用于声明一组带标识符的常数。
public class eunmTest1 {
public static void main(String[] args) {
Season spring = new Season("春天", "温暖");
Season summer = new Season("夏天", "热");
Season autumn = new Season("秋天","凉快");
Season winter = new Season("冬天","冷");
//对于季节而言,它的对象是固定的四个,不会有更多的,这样设计Season,不能体现出季节只有四种
Season red = new Season("h","s");
//因此需要使用枚举
}
}
class Season{
private String name;
private String desc;//描述
public Season(String name, String desc) {
this.name = name;
this.desc = desc;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
自定义枚举:
public class enumTest3 {
public static void main(String[] args) {
System.out.println(Season1.SPRING);
System.out.println(Season1.SUMMER);
System.out.println(Season1.AUTUMN);
System.out.println(Season1.WINTER);
}
}
//自定义枚举实现
class Season1{
//1:将构造器私有化,防止被new出来
//2:去掉set方法,防止该类属性被修改
//3:在该类内部创建固定的对象
//4:可以加入final关键字
//对外暴露对象:public final static
private String name;
private String desc;//描述
//定义四个对象:
public static final Season1 SPRING=new Season1("春天","暖");
public static final Season1 SUMMER=new Season1("夏天","热");
public static final Season1 AUTUMN=new Season1("秋天","凉");
public static final Season1 WINTER=new Season1("冬天","冷");
private Season1(String name, String desc) {
this.name = name;
this.desc = desc;
}
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
@Override
public String toString() {
return "Season1{" +
"name='" + name + '\'' +
", desc='" + desc + '\'' +
'}';
}
}
Enum
关键字实现枚举:
public class enumTest2 {
public static void main(String[] args) {
System.out.println(Season2.SPRING);
System.out.println(Season2.SUMMER);
}
}
enum Season2{
//1:使用关键字enum代替class
//2:public static final Season1 SPRING=new Season1("春天","暖");----->SPRING("春天","暖");
//3:如果有多个常量,使用,号隔开即可
//4:如果使用enum来实现枚举,要将定义常量对象,写在前面
//5:如果使用无参构造器,括号()都可以省略
SPRING("春天","暖"),SUMMER("夏天","热"),AUTUMN("秋天","凉"),WINTER("冬天","冷");
private String name;
private String desc;//描述
//定义四个对象:
// public static final Season1 SPRING=new Season1("春天","暖");
// public static final Season1 SUMMER=new Season1("夏天","热");
// public static final Season1 AUTUMN=new Season1("秋天","凉");
// public static final Season1 WINTER=new Season1("冬天","冷");
private Season2(String name, String desc) {
this.name = name;
this.desc = desc;
}
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
@Override
public String toString() {
return "Season1{" +
"name='" + name + '\'' +
", desc='" + desc + '\'' +
'}';
}
}
Enum
原理:
Java文件编译原理:
查看enum
的反编译文件:
使用了enum
关键字的枚举类都继承了java.lang.Enum
类。
练习:
public class enumTest4 {
public static void main(String[] args) {
Gender boy1= Gender.BOY;
Gender boy2=Gender.BOY;
//本质上是调用父类Enum的toString方法,输出该对象的名字
System.out.println(boy1);
System.out.println(boy1==boy2);//boy1和boy2指向的同一个常量BOY的地址,所以相等输出True
}
}
enum Gender{
BOY,GIRL;
}
Enum
常用方法:
练习:
/*
* Enum类的各种方法:
* */
public class enumTest5 {
public static void main(String[] args) {
Season_test spring=Season_test.SPRING;
//1:name()方法:输出枚举对象名字
System.out.println(spring.name());
//2:ordinal()方法:输出该枚举对象的次序(从0开始),SPRING是第一个枚举对象,所以输出0
System.out.println(spring.ordinal());
//3:反编译可以看见values方法,返回该枚举类的所有对象
Season_test[] values=Season_test.values();
for(Season_test season:values){//迭代输出
System.out.println(season);
}
//4:valueOf()将字符串转化成枚举对象,要求字符串必须为已有的常量名,否则报异常
Season_test spring_test = Season_test.valueOf("SPRING");
System.out.println("spring_test:"+spring_test);
System.out.println(spring==spring_test);//true
//5:compareTo()比较两个,枚举常量,比较的就是两个枚举对象的编号return self.ordinal - other.ordinal;的差值
System.out.println(spring.compareTo(spring_test));
//6:toString()输出枚举对象的名字,可以重写该方法,来输出你想输出的东西
System.out.println(spring);
}
}
enum Season_test{
SPRING("春天","暖"),SUMMER("夏天","热"),AUTUMN("秋天","凉"),WINTER("冬天","冷");
private String name;
private String desc;//描述
private Season_test(String name, String desc) {
this.name = name;
this.desc = desc;
}
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
@Override
public String toString() {
return "Season_test{" +
"name='" + name + '\'' +
", desc='" + desc + '\'' +
'}';
}
}
练习:
创建一个Week枚举类,并输出。
public class enumTest6 {
public static void main(String[] args) {
Week[] weeks=Week.values();
for (Week week : weeks) {
System.out.println(week);
}
}
}
enum Week{
MONDAY("星期一"),TUESDAY("星期二"),WEDNESDAY("星期三"),THURSDAY("星期四"),FRIDAY("星期五"),SATURDAY("星期六"),SUNDAY("星期天");
private String name;
Week(String name) {//默认为private
this.name = name;
}
@Override
public String toString() {
return name;
}
}
注意
1:使用enum
关键字后,就不能再继承其他的类了,因为enum
会隐式的继承Enum
,Java是单继承机制。
2:枚举类和普通类一样,可以实现接口,如下形式。
enum
类名 implements 接口1 ,接口2 {}