枚举是一个被命名的整型常数的集合,用于声明一组带标识符的常数。
在数学和计算机科学理论中,一个集的枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数。
现实生活种的枚举:一个星期只有7天,一年四季只有春夏秋冬,人类的性别只有男女。
通俗点说:枚举就是固定数的集合。
在java中有两种方式可以实现枚举。自定义枚举和使用enum关键字实现枚举
自定义实现枚举需要满足几个条件:
案例演示:
一年四季。(一年只有四个季节,不可能少或者多)
public class enum11 {
public static void main(String[] args) {
System.out.println(Season.SPRING);//自动使用toString
System.out.println(Season.SUMMER);
System.out.println(Season.WINTER);
System.out.println(Season.AUTUMN);
}
}
class Season{//自定义枚举类
private String name;
private String climate;
private Season(String name, String climate) {//构造器私有化
this.name = name;
this.climate = climate;
}
public static final Season SPRING = new Season("春天","温暖");//内部直接创建对象且static final修饰
public static final Season SUMMER = new Season("夏天","炎热");
public static final Season AUTUMN = new Season("秋天","凉爽");
public static final Season WINTER = new Season("冬天","寒冷");
public String getName() {
return name;
}
public String getClimate() {
return climate;
}
@Override
public String toString() {
return "Season{" +
"name='" + name + '\'' +
", climate='" + climate + '\'' +
'}';
}
}
在java中可以直接使用enum关键字来快速定义一个枚举,但是有一定的语法要求。
enum定义枚举演示
public class enum11 {
public static void main(String[] args) {
System.out.println(Season.SPRING);//自动使用toString
System.out.println(Season.SUMMER);
System.out.println(Season.WINTER);
System.out.println(Season.AUTUMN);
}
}
enum Season{//自定义枚举类
//内部直接创建对象且static final修饰
SPRING("春天","温暖"),SUMMER("夏天","炎热"),WINTER("秋天","凉爽"),AUTUMN("冬天","寒冷");
private String name;
private String climate;
private Season(String name, String climate) {//构造器私有化
this.name = name;
this.climate = climate;
}
public String getName() {
return name;
}
public String getClimate() {
return climate;
}
@Override
public String toString() {
return "Season{" +
"name='" + name + '\'' +
", climate='" + climate + '\'' +
'}';
}
}
使用enum关键字定义枚举注意事项
enum关键字定义枚举练习
1.下列语法是否正确,为什么
enum Gender{
BOY,GIRL;
}
正确,BOY和GIRL自动调用无参构造器,没有实参可以把括号省略
2.下面代码会输出什么
enum Gender2{
BOY,GIRL;
}
另一个类的main方法中
Gender2 boy = Gender2.BOY;
Gender2 boy2 = Gender2.BOY;
System.out.println(boy);
System.out.println(boy2 == boy);
它把BOY的地址给了另外两个引用,然后输出boy,会自动中调toString方法,由于Gender2没有重写,所以会找Gender2的父类enum类的toString。输出BOY,然后两个引用都是指向同一个地址,输出true
因为每个用enum关键字修饰的枚举都会默认继承enum,所以enum的方法,子类枚举也可以用
各方法演示:
public class enum11 {
public static void main(String[] args) {
// 2. name();返回当前对象名(常量对象名),子类不能重写
System.out.println(Season.SUMMER.name());
// 3. ordinal();返回当前对象位置号,对象的编号。从0开始
System.out.println(Season.SUMMER.ordinal());
// 4. values();将当前枚举类中的所有常量对象,汇合在一个数组,且返回这个数组
Season[] seasons = Season.values();
for (Season s:seasons) {
System.out.println(s);// 1. toString();
}
// 5. valuesOf();用实参传入的字符串,到枚举类中查找有没有叫这个名字的对象,如果有就返回这个对象,没有就报错
Season s2 = Season.valueOf("SPRING");
System.out.println(s2.getName());
// 6. compareTo();将两个枚举常量对象的编号相减
System.out.println(Season.SUMMER.compareTo(Season.AUTUMN));
}
}
enum Season{//自定义枚举类
//内部直接创建对象且static final修饰
SPRING("春天","温暖"),SUMMER("夏天","炎热"),WINTER("秋天","凉爽"),AUTUMN("冬天","寒冷");
private String name;
private String climate;
private Season(String name, String climate) {//构造器私有化
this.name = name;
this.climate = climate;
}
public String getName() {
return name;
}
public String getClimate() {
return climate;
}
@Override
public String toString() {
return "Season{" +
"name='" + name + '\'' +
", climate='" + climate + '\'' +
'}';
}
}
输出结果:
SUMMER
1
Season{name=‘春天’, climate=‘温暖’}
Season{name=‘夏天’, climate=‘炎热’}
Season{name=‘秋天’, climate=‘凉爽’}
Season{name=‘冬天’, climate=‘寒冷’}
春天
-2
注意点:比如Season枚举类内部的常量对象是从0开始编号的
1.定义week枚举类,其中有周一至周天的定义:
Monday,Tuesday , Wednesday ,Thursday, Friday , Saturday , Sunday
2. 使用方法汇合成一个数组,且输出:星期一至星期日的字样
public class Test1 {
public static void main(String[] args) {
week[] weeks = week.values();
for (week w:weeks) {
System.out.println(w);
}
}
}
enum week{
MONDAY("星期一"),TUESDAY("星期二"),WEDNESDAY("星期三"),THURSDAY("星期四"),
FRIDAY("星期五"),SATURDAY("星期六"),SUNDAY("星期日");
private String name;
private week(String name) {
this.name = name;
}
@Override
public String toString() {
return this.name;
}
}
运行结果:
星期一
星期二
星期三
星期四
星期五
星期六
星期日
因为使用enum关键字定义的枚举,会默认自动继承enum类。而java是单继承,不允许多继承
枚举实现接口语法:enum 枚举名 implement 接口名{}