Java基础枚举学习笔记
一.什么是枚举?
枚举是一组常量的集合。
可以这样理解:枚举属于一种特殊的类,里面只包含一组有限的特定的对象。
比如说有个季节的对象,而季节只有春夏秋冬四个季节并且是无法修改的,那我们传统的创建对象
的方式就没办法实现了,因此,这样的设计不好,所以我们就需要枚举类
枚举类就是把具体的对象一个一个列举出来
传统方式举例:
public class Enumeration {
public static void main(String[] args) {
Season spring = new Season("春天","温暖");
Season sunmer = new Season("夏天","炎热");
Season autumn = new Season("秋天","凉爽");
Season winter = new Season("冬天","温暖");
Season xxxxxx = new Season("xx天","xxxx");//可以看到我们用传统的方式还能添加无关的信息
sunmer.setName("设置为红天"); //并且可以对原有的属性进行修改
}
}
class Season{
private String name;
private String 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 Season(String name, String desc) {
this.name = name;
this.desc = desc;
}
}
二.实现枚举的方式
1.自定义实现枚举
四个特点
1)构造器私有化 (不让外部创建对象)
2)本类内部创建一组对象[ ] (列举固定对象)
3)对外暴露对象(通过为对象添加public final static修饰符) (让外边能对这个对象进行访问)
4)可以提供get方法,但是不要提供 set (只读)
使用案例:
public class Enumeration2 {
public static void main(String[] args) {
//类加载创建自动创建静态变量
System.out.println(Season2.AUTUMN);
}
}
class Season2{
private String name;
private String desc;
//通过final修饰的变量一般都大写
//定义一组不能被修改的对象
public final static Season2 SPTING = new Season2("春天","温暖");
public final static Season2 SUMMER = new Season2("夏天","炎热");
public final static Season2 AUTUMN = new Season2("秋天","凉爽");
public final static Season2 WINTER = new Season2("冬天","寒冷");
//去除set()方法
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
//构造器私有化
private Season2(String name, String desc) {
this.name = name;
this.desc = desc;
}
@Override
public String toString() {
return "Season2{" +
"name='" + name + '\'' +
", desc='" + desc + '\'' +
'}';
}
}
2.使用enum关键字实现枚举
(相当于自定义枚举类的简化版)
使用enum关键字有五个细节
1.使用关键字enum替代class (使用了这个关键字后它会默认隐式继承Enum类)
2.public static final Season SPRING = new Season(“春天”,“温暖")
直接使用SPRING(“春天”,“温暖”)–>常量名(实参列表)
3.如果使用enum 来实现枚举,要求将定义常量对象,写在前面
4.如果有多个常量(对象),使用,号间隔即可,最后一个带分号
5.如果使用无参构造器创建对象,则小括号也可以省略
使用案例:
public class Enumeration3 {
public static void main(String[] args) {
System.out.println(Season3.AUTUMN);
}
}
//class被替换成enum
enum Season3{
//写在了第一行,并且多个常量(对象)用,隔开 SPRING("春天","温暖")-->常量名(实参列表) What是调用了无参构造器
SPRING("春天","温暖"),SUMMER("夏天","炎热"),AUTUMN("秋天","凉爽"),WINTER("冬天","寒冷"),What;
private String name;
private String desc;
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
private Season3(String name, String desc) {
this.name = name;
this.desc = desc;
}
@Override
public String toString() {
return "Season2{" +
"name='" + name + '\'' +
", desc='" + desc + '\'' +
'}';
}
}
对比自定义枚举类就是简化了定义对象的方式!(所以一般都用这种了)
三.Enum常用方法
使用了这个关键字后它会默认隐式继承Enum类,所以我们可以使用Enum类里面的方法。
演示案例:
public class EnumMethod {
public static void main(String[] args) {
//使用Season3枚举类,来演示各种方法(同包下内部类可访问)
Season3 autumn = Season3.AUTUMN;
//返回枚举对象的变量名(Enum类重写了toString())
System.out.println(autumn.toString()); //AUTUMN
//输出枚举对象的名字
System.out.println(autumn.name()); //AUTUMN
//ordinal()输出的是该枚举对象的次序/编号,从0开始编号
//AUTUMN 枚举对象是第三个,因此输出2
System.out.println(autumn.ordinal()); //2
//含有定义的所有枚举对象
Season3[] values = Season3.values();
for (Season3 season: values) {
System.out.println(season); //输出每一个枚举对象的信息
}
//1.根据你输入的 "AUTUMN "到Season2的枚举对象去查找
//2.如果找到了,就返回这个对象的具体信息,如果没有找到,就报错
Season3 autumn1 = Season3.valueOf("AUTUMN");
System.out.println(autumn1); //输出这个对象的具体信息,autumn==autumn1
//返回AUTUMN编号-SUMMER编号的值 如果返回0表示同一个对象
System.out.println(Season3.AUTUMN.compareTo(Season3.SUMMER));
}
}
四.枚举类实现接口
- 使用enum关键字后,就不能再继承其它类了,因为enum会隐式继承Enum(相当于有父类了),而Java是单继承机制。
- 枚举类和普通类一样,可以实现接口—> enum 类名 implements 接口1,接口2 { }
使用案例:
public class Demo {
public static void main(String[] args) {
//枚举类不能被实例化(不能被new),必须先调用构造器才能使用里面的方法
Music.CLASSICMUSIC.playing();
}
}
interface IPlaying{
public void playing();
}
enum Music implements IPlaying{
CLASSICMUSIC;
@Override
public void playing() {
System.out.println("bbbbb");
}
}