枚举
锁定了取值范围的数据类型
枚举其实就是静态常量
注意问题
1.枚举常量直接用逗号隔开,最后分号可写可不写,如果后边有代码,必须加分号
2. 枚举只能包含私有构造方法,属性和普通方法,必须写在常量后边
枚举类型可以看做我们平时新建.java差不多,只是枚举类限制了此类的实例对象。
原理解析
public enum Season {
SPRING,SUMMER,AUTUMN,WINTER;
public static void main(String[] args) {
// 获取方式
// 1.valueof方法 获取枚举类型
Season summer = Season.valueOf("SUMMER");
System.out.println(summer);
// 2.直接初始化
Season summer1 = Season.SUMMER;
}
}
通过反编译可以发现:
枚举本身就是一个继承于Enum类的final类
其各个枚举常量就是final类的静态常量对象,他们在静态代码块中完成创建
不写构造方法时会 默认的构造方法会调用父类的构造方法
使用
为枚举常量添加属性
想要添加属性,必须要先定义属性,并重写私有构造方法(属性赋值),能获取属性的公开方法
public enum Season {
SPRING("春天"),
SUMMER("夏天"),
AUTUMN("秋天"),
WINTER("冬天");
// 常量的属性
private String attr;
// 覆盖构造造方法,为常量添加属性
private Season(String attr){
this.attr = attr;
}
// 属性获取
public String getAttr(){
return attr;
}
public static void main(String[] args) {
Season summer = Season.SUMMER;
System.out.println(summer);
// 获得属性值
String attr = Season.SUMMER.getAttr();
System.out.println(attr);
}
}
输出 :
summer
夏天
我们添加的私有构造方法,属性,获取属性方法都是为了在我们定义枚举常量时为其赋值。
我们反编译发现,覆盖的构造方法会调用父类的构造方法,在静态代码块中为枚举常量附上我们自定义的属性,之后我们可以通过get方法在外部获得这些静态常量的属性
单例模式
反编译发现,枚举的实现完全符合单例的构建步骤:
1.在类内部定义一个实例
2.私有化构造方法
3.定义一个公开方法获得返回值
public enum SingleTon {
SINGLE_TON;
public static void main(String[] args) {
// 获得的对象是单例
SingleTon singleTon = SingleTon.SINGLE_TON;
}
}
Switch支持枚举
重写toString
默认输出name属性,即枚举常量名
枚举中的抽象方法
反编译过后可以发现,枚举类不可继承别的类,因为其已经默认继承Enum类,也不可能被其他类继承,因为其本身就是fianl类
但其中可定义抽象方法,枚举常量本身就是该类的实例对象,故每个枚举类都要实现这个抽象方法,可用于给枚举常量增加功能;
如下,利用抽象方法给枚举常量增加了指向下一个枚举常量的功能
public enum TrafficLamp {
RED(30) {
@Override
public TrafficLamp getNextLamp() {
return GREEN;
}
}, GREEN(45) {
@Override
public TrafficLamp getNextLamp() {
return YELLOW;
}
}, YELLOW(5) {
@Override
public TrafficLamp getNextLamp() {
return RED;
}
};
private int time;
public int getTime(){
return time;
}
private TrafficLamp(int time) {
this.time = time;
}
//一个抽象方法
public abstract TrafficLamp getNextLamp();
public static void main(String[] args) {
TrafficLamp red = TrafficLamp.RED;
System.out.println(red.getTime());
}
}