枚举
在Java中枚举是指一种特殊的类。特殊在这个类的对象是固定的、有限的、几个常量对象
。
在Java5之前
package com.gj.jdk5.before;
import java.util.Objects;
/*
保证无论谁来使用Week类,只能从它7个对象中选一个,不能有其他对象。
思考:
(1)new对象要用到构造器 => 对构造器做限制,加private
(2)如何给外面准备好7个对象
*/
public class Week {
//public:公开
//static:表示外面可以通过“类名.MONDAY”进行使用
//final:不可修改
public static final Week MONDAY = new Week(1,"星期一");
public static final Week TUESDAY = new Week(2,"星期二");
public static final Week WEDNESDAY = new Week(3,"星期三");
public static final Week THURSDAY = new Week(4,"星期四");
public static final Week FRIDAY = new Week(5,"星期五");
public static final Week SATURDAY = new Week(6,"星期六");
public static final Week SUNDAY = new Week(7,"星期日");
//建议枚举对象的属性也加final
private final int value;
private final String description;
/* private Week(){
}*/
private Week(int value,String description){
this.value = value;
this.description = description;
}
public int getValue() {
return value;
}
public String getDescription() {
return description;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Week week = (Week) o;
return value == week.value && Objects.equals(description, week.description);
}
@Override
public int hashCode() {
return Objects.hash(value, description);
}
@Override
public String toString() {
return "Week{" +
"value=" + value +
", description='" + description + '\'' +
'}';
}
}
package com.gj.jdk5.before;
public class TestWeek {
public static void main(String[] args) {
//想要星期一的对象
Week m1 = Week.MONDAY;
//想要星期二的对象
Week m2 = Week.THURSDAY;
//再次获取星期一的对象
Week m3 = Week.MONDAY;
System.out.println(m1 == m3);//true
System.out.println(m1 == m2);//false
System.out.println(m1);
}
}
在Java5之后
语法:
【修饰符】 enum 枚举类名{
常量对象列表;
其他成员
}
注意:
- 枚举类的常量对象列表必须在首行
- 枚举类的构造器一定private(因为要隐藏外界new对象),private可以省略,而且也不能写别的权限修饰符。
- 枚举类没有子类,因为它的构造器私有化了,子类无法调用。
- 枚举类不能指定其他父类,它有一个固定父类Enum。
案例:
package com.gj.jdk5.after;
//class:是普通类
//enum:是枚举类,是特殊的类
public enum Week {
//常量对象列表,必须在枚举类首行
MONDAY(1,"星期一"),
TUESDAY(2,"星期二"),
WEDNESDAY(3,"星期三"),
THURSDAY(4,"星期四"),
FRIDAY(5,"星期五"),
SATURDAY(6,"星期六"),
SUNDAY(7,"星期日");
//建议枚举对象的属性也加final
private final int value;
private final String description;
//构造器前面省略了private
Week(int value, String description) {
this.value = value;
this.description = description;
}
public int getValue() {
return value;
}
public String getDescription() {
return description;
}
@Override
public String toString() {
return "Week{" +
"value=" + value +
", description='" + description + '\'' +
"} " + super.toString();
}
}
创建测试类
package com.gj.jdk5.after;
public class TestWeek {
public static void main(String[] args) {
//获取星期一对象
Week m1 = Week.MONDAY;
System.out.println(m1);
Week m2 = Week.MONDAY;
System.out.println(m2);
System.out.println(m1 == m2);//true
System.out.println(m1.equals(m2));//true
}
}
枚举类的方法
- public final String name():用于返回枚举对象的常量对象名
- public final int ordinal():用于返回枚举对象的下标
- public static 枚举类型[] values():用于返回当前枚举类的所有常量对象
- public static 枚举类型 valueOf(String 常量对象名):根据常量对象名获取常量对象。
- public String toString():Enum父类中默认返回的是常量对象名,自己的枚举类可以重写toString。
- public boolean equals(Object obj)和 public int hashCode():枚举类中这两个方法不需要也不能重写,因为枚举类的对象是固定的几个常量对象,它们比较相等就用地址值比较即可。Object类中equals就是等价于==
举例
package com.gj.jdk5.after;
import java.util.Scanner;
//创建测试类
public class TestMethod {
public static void main(String[] args) {
Week w1 = Week.MONDAY;
System.out.println(w1.name());
System.out.println(w1.ordinal());
Week w2 = Week.FRIDAY;
System.out.println(w2.name());
System.out.println(w2.ordinal());
Week[] all = Week.values();
for (Week w : all) {
System.out.println(w);
}
System.out.println(Week.values()[2]);//获取星期三
System.out.println("==================");
// 从键盘输入星期对象的名称,然后从Week类中获取该对象
Scanner input = new Scanner(System.in);
System.out.print("请输入星期的单词:");
String name = input.next();
// System.out.println("name = " + name);
//可以把字符串自动转为大写
name = name.toUpperCase();//把字符串的单词转为大写
// System.out.println("name = " + name);
Week week = Week.valueOf(name);
System.out.println(week);
input.close();
}
}
switch在Java5开始支持枚举
switch支持哪些类型?4种基本数据类型(byte,short,char,int)及其对应的包装类,枚举,字符串String。
package com.gj.jdk5.after;
import java.util.Scanner;
public class TestSwitch {
public static void main(String[] args) {
//从键盘输入星期的单词,从Week类中获取对应的星期对象
//如果星期对象是MONDAY,那么就输出这是最痛苦的一天
//....
Scanner input = new Scanner(System.in);
System.out.print("请输入星期的单词:");
String name = input.next();
//可以把字符串自动转为大写
name = name.toUpperCase();//把字符串的单词转为大写
Week week = Week.valueOf(name);
System.out.println(week);
switch (week){
case MONDAY -> System.out.println("这是最痛苦的一天1");
case TUESDAY -> System.out.println("这是最痛苦的一天2");
case WEDNESDAY -> System.out.println("这是最痛苦的一天3");
case THURSDAY -> System.out.println("这是最痛苦的一天4");
case FRIDAY -> System.out.println("这是最痛苦的一天5");
case SATURDAY -> System.out.println("这是最痛苦的一天6");
case SUNDAY -> System.out.println("这是最开心的一天");
}
input.close();
}
}