枚举类
- enum是关键字
- Enum是类名
- 枚举类:类的对象数量有限且确定:星期,性别,季节等
- 枚举类只有一个对象 则可以作为一种单例模式的实现方
式。
枚举类的定义
- jdk5.0之前自定义枚举类
- jdk5.0之后使用enum关键字
例一:自定义
package meijv;
/*
* 枚举数量有限且确定,定义一组常量时强烈建议是哦那个
*/
public class Demo01 {
public static void main(String[] args) {
Season spring = Season.SPRING;
System.out.println(spring);//打印结果:Season [name=春天, seasonDesc=春暖花开,鸟语花香]
}
}
class Season{
//1.声名Season属性,用private final修饰
private final String name;
private final String seasonDesc;
//2.私有化构造器,并对属性赋值
private Season(String name, String seasonDesc) {
this.name = name;
this.seasonDesc = seasonDesc;
}
//3.提供枚举类多个对象:public static final
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("冬天", "冰天雪地,一片雪白");
//4.获取对象属性的方法,输出方法
public String getName() {
return name;
}
public String getSeasonDesc() {
return seasonDesc;
}
@Override
public String toString() {
return "Season [name=" + name + ", seasonDesc=" + seasonDesc + "]";
}
}
-
打印结果:Season [name=春天, seasonDesc=春暖花开,鸟语花香]
-
属性
- 枚举动类对象的属性不应允许被改动, 所以应该使用 private final 修饰
- 枚举类的使用 private final 修饰的属性应该在构造器中为其赋值
- 若枚举类显式的定义了带参数的构造器, 则在列出枚举值时也必须对应的传入参数
-
定义步骤
- 私有化类的构造器,保证不能在类的外部创建其对象
- 在类的内部创建枚举类的实例。声明为:public static final
- 对象如果有实例变量,应该声明为private final,并在构造器中初始化
例二:关键字enum定义
package meijv;
//定义的枚举类默认继承java.lang.Enum类
public class Demo02 {
public static void main(String[] args) {
Season1 summer = Season1.SUMMER;
System.out.println(summer);
}
}
enum Season1 {
// 1.提供当前枚举类的对象,多个对象之间逗号隔开,分号结束
SPRING("春天", "春暖花开,鸟语花香"), SUMMER("夏天", "夏日炎炎,烈日当头"), AUTUMN("秋天", "秋高气爽,硕果累累"), WINTER("冬天", "冰天雪地,一片雪白");
// 2.声明类属性
private final String name;
private final String desc;
private Season1(String name, String desc) {
this.name = name;
this.desc = desc;
}
// 3.各种方法
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
}
- 使用 enum 定义的枚举类默认继承了 java.lang.Enum类,因此不能再
继承其他类 - 枚举类的构造器只能使用 private 权限修饰符
- 枚举类的所有实例必须在枚举类中显式列出(, 分隔 ; 结尾)。列出的实例系统会自动添加 public static final 修饰
- 必须在枚举类的第一行声明枚举类对象
Enum类常用方法
- values() 方法:返回枚举类型的对象数组。该方法可以很方便地遍历所有的
枚举值。 - valueOf(String str):可以把一个字符串转为对应的枚举类对象。要求字符串必须是枚举类对象的“名字”。如不是,会有运行时异常:llegalArgumentException。
- toString():返回当前枚举类对象常量的名称
public class Demo02 {
public static void main(String[] args) {
Season1 summer = Season1.SUMMER;
System.out.println(summer);
//toString()
System.out.println(summer.toString());
//values()
System.out.println("*************************");
Season1[] values = Season1.values();
for(int i=0;i<values.length;i++) {
System.out.println(values[i]);
}
}
枚举类实现接口
- 正常情况:继承接口,重写方法
- 每个对象都进行重写。
package meijv;
public class Demo03 {
/*枚举类实现接口
* 情况一:
*/
public static void main(String[] args) {
Season2 autumn = Season2.AUTUMN;
autumn.show();
}
}
interface m1{
void show();
}
enum Season2 implements m1 {
// 1.提供当前枚举类的对象,多个对象之间逗号隔开,分号结束
SPRING("春天", "春暖花开,鸟语花香"), SUMMER("夏天", "夏日炎炎,烈日当头"), AUTUMN("秋天", "秋高气爽,硕果累累"), WINTER("冬天", "冰天雪地,一片雪白");
// 2.声明类属性
private final String name;
private final String desc;
private Season2(String name, String desc) {
this.name = name;
this.desc = desc;
}
// 3.各种方法
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
public String toString() {
return "Season [name=" + name + ", seasonDesc=" + desc + "]";
}
public void show() {//正常情况
System.out.println("这是一个季节");
}
}
package meijv;
//定义的枚举类默认继承java.lang.Enum类
enum Season1 implements m1{
// 1.提供当前枚举类的对象,多个对象之间逗号隔开,分号结束
SPRING("春天", "春暖花开,鸟语花香"){
@Override
public void show() {
System.out.println("春天在哪里");
}
},
SUMMER("夏天", "夏日炎炎,烈日当头"){
@Override
public void show() {
// TODO Auto-generated method stub
System.out.println("宁静的夏天");
}
},
AUTUMN("秋天", "秋高气爽,硕果累累"){
@Override
public void show() {
// TODO Auto-generated method stub
System.out.println("秋天不回来");
}
},
WINTER("冬天", "冰天雪地,一片雪白"){
@Override
public void show() {
// TODO Auto-generated method stub
System.out.println("预约在冬季");
}
};
// 2.声明类属性
private final String name;
private final String desc;
private Season1(String name, String desc) {
this.name = name;
this.desc = desc;
}
// 3.各种方法
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
public String toString() {
return "Season [name=" + name + ", seasonDesc=" + desc + "]";
}
}