Java枚举(enum)学习笔记
1、什么是枚举
在java开发中,有时候一个类的对象是有限而且固定的,比如我们常见的季节类,就是春夏秋冬。只有这四个简单的对象而已,这些实例有限而且固定的类,在java中,被称为枚举类。
在java中,类的对象是有限个,确定的。这个类我们定义为枚举类。
举例:
星期:一二三四五六日
性别:男女
2、在JDK1.5之后提供了使用enum关键字来创建枚举类
a.自定义枚举类:
public class Season {
//属性
private final String seasonName;//季节名称
private final String seasonDesc;//季节描述
//利用构造器对属性进行赋值操作:
private Season(String seasonName,String seasonDesc){
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
//提供枚举类的有限的确定的对象:
public static final Season SPRING = new Season("春天","春暖花开");
public static final Season SUMMER = new Season("夏天","夏日炎炎");
public static final Season AUTUMN = new Season("秋天","硕果累累");
public static final Season WINTER = new Season("冬天","冰天雪地");
//额外的因数:
public String getSeasonName() {
return seasonName;
}
public String getSeasonDesc() {
return seasonDesc;
}
@Override
public String toString() {
return "Season{" +
"seasonName='" + seasonName + '\'' +
", seasonDesc='" + seasonDesc + '\'' +
'}';
}
}
测试类
public class TestSeason {
public static void main(String[] args) {
Season summer = Season.SUMMER;
System.out.println(summer);
System.out.println(summer.getSeasonName());
}
}
运行结果:
b.使用enum关键字创建枚举类
public enum Season {
//提供枚举类的有限的确定的对象:
SPRING("春天","春暖花开"),
SUMMER("夏天","夏日炎炎"),
AUTUMN("秋天","硕果累累"),
WINTER("冬天","冰天雪地");
private final String seasonName;//季节名称
private final String seasonDesc;//季节描述
//利用构造器对属性进行赋值操作:
private Season(String seasonName, String seasonDesc){
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
//额外的因数:
public String getSeasonName() {
return seasonName;
}
public String getSeasonDesc() {
return seasonDesc;
}
// @Override
// public String toString() {
// return "Season{" +
// "seasonName='" + seasonName + '\'' +
// ", seasonDesc='" + seasonDesc + '\'' +
// '}';
// }
}
测试类:
public class TestSeason {
public static void main(String[] args) {
Season winter = Season.WINTER;
System.out.println(winter);
//enum关键字对应的枚举类的上层父类是:java.lang.Enum
//但是我们自定义的枚举类上层父类:Object
System.out.println(Season.class.getSuperclass().getName());
}
}
c.创建无属性的枚举类以及枚举类的常见方法
- 用ENUM关键字创建的Season枚举类上面的父类是java.lang.Enum
- 常用方法有以下几种:
- toString() 获取对象的名字
- values() 返回枚举类对象的数组
- valueof() 通过对象名字获取枚举对象
无属性枚举类:
public enum Season {
SPRING,
SUMMER,
AUTUMN,
WINTER;
}
测试类及常用方法:
public class TestSeason {
public static void main(String[] args) {
//用ENUM关键字创建的Season枚举类上面的父类是java.lang.Enum,.
//常用方法自定义的Season可以直接拿过来使用
//toString(); 获取对象的名字
Season autumn = Season.AUTUMN;
System.out.println("=========toString()================");
System.out.println(autumn.toString());
System.out.println("==========values()===============");
//values : 返回枚举类对象的数组
Season[] values = Season.values();
for (Season value : values) {
System.out.println(value);
}
System.out.println("==========valueOf()===============");
//valueof() 通过对象名字获取枚举对象
Season autumn1 = Season.valueOf("AUTUMN");
System.out.println(autumn1);
}
}
d.枚举类实现接口以及通用方法和不同对象定制方法
- 如果接口中的方法对于枚举类中的每一个枚举对象都相同,就是方法是通用的,那么可以直接写到枚举类内部。这时候,每一个枚举类对象调用方法都是相同的。
- 也可以在枚举类中给每一个对象实现定制的方法,每个类都实现一次需要实现的接口方法,这样在方法调用的时候,每个对象调用的就是自己实现的接口方法
接口类:
public interface TestInterface {
void show();
void print();
}
枚举类:
public enum Season implements TestInterface{
/**1、如果该接口对于枚举类中的每一个枚举对象都相同,就是方法是通用的,那么可以直接写到枚举类内部。这时候,每一个枚举类对象调用show都会输出同一句话
*2、枚举类可以让每一个对象实现定制的方法,每个类都实现一次需要实现的接口,这样在方法调用的时候,每个对象调用的就是自己实现的接口
*/
SPRING{
@Override
public void show() {
System.out.println("这是春天");
}
},
SUMMER{
@Override
public void show() {
System.out.println("这是夏天");
}
},
AUTUMN{
@Override
public void show() {
System.out.println("这是秋天");
}
},
WINTER{
@Override
public void show() {
System.out.println("这是冬天");
}
};
//如果该接口对于枚举类中的每一个枚举对象,
// 都相同,就是方法是通用的,那么可以直接写到枚举类内部。
// 如下代码,这时候,每一个枚举类对象调用show都会输出同一句话
@Override
public void print() {
System.out.println("这是print...");
}
}
测试类:
public class Test {
public static void main(String[] args) {
/**1、如果该接口对于枚举类中的每一个枚举对象都相同,就是方法是通用的,那么可以直接写到枚举类内部。这时候,每一个枚举类对象调用show都会输出同一句话
*2、但是枚举类可以让每一个对象实现定制的方法,每个类都实现一次需要实现的接口,这样在方法调用的时候,每个对象调用的就是自己实现的接口
*/
Season autumn = Season.AUTUMN;
autumn.show();
autumn.print();
Season summer = Season.SUMMER;
summer.show();
summer.print();
}
}
e.枚举类的应用场景
- 可以简化给对象赋值时校验是否符合规范,如下列中的sex属性,限定只能设置枚举中的值。
- 作为switch的入参
枚举类:
public enum Gender {
男,
女;
}
Person类
public class Person {
//属性:
private int age;
private String name;
//private String sex;
private Gender sex;
public Gender getSex() {
return sex;
}
public void setSex(Gender sex) {
this.sex = sex;
}
public Person() {
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// public String getSex() {
// return sex;
// }
//
// public void setSex(String sex) {
// this.sex = sex;
// }
@Override
public String toString() {
return "Person{" +
"age=" + age +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
'}';
}
}
测试类一、在给对象属性赋值时做为限定条件
public class Test {
public static void main(String[] args) {
Person p = new Person();
p.setAge(19);
p.setName("qingjiang");
p.setSex(Gender.男);
System.out.println(p);
System.out.println(p.getSex());
}
}
测试类二、枚举在Switch中的应用
public class Test02 {
public static void main(String[] args) {
Gender sex = Gender.男;
// Switch可以接受枚举类型
// Switch可传入类型:int short byte char String 枚举
switch (sex){
case 男:
System.out.println("boy");
break;
case 女:
System.out.println("girl");
break;
}
}
}
这世上所有美好的东西,都需要踮起脚尖。