目录
枚举类型本质上也是一种类,只不过是这个类的对象是有限的、固定的几个,不能让用户随意创建。
枚举类的例子举不胜举:
星期:Monday(星期一)...Sunday(星期天)
性别: Man(男)、Woman(女)
月份: January(1月)...December(12月)
季节:Spring(春节)...Winter(冬天)
三原色: red(红色)、green(绿色)、blue(蓝色)
若枚举只有一个对象,则可以作为一种单例模式的实现方式
枚举类的实现:
开发中的建议:
开发中,如果针对某个类,其实例是确定个数的,则推荐将此类声明为枚举类。
在jdk5.0之前,需要程序员自定义枚举类型。
在jdk5.0之后,Java支持enum关键字来快速定义枚举类型
在JDK5.0之前如何声明枚举类呢?
私有化类的构造器,保证不能在类的外部创建其对象。
在类的内部创建枚举类的实例。声明为:public static final,对外暴露这些常量对象
对象如果有实例变量,应该声明为private final(建议,不是必须),并在构造器中初始化。
代码:
package com.maven.pojo;
public class Season {
public static void main(String[] args) {
System.out.println(SeasonInstance.spring);
System.out.println(SeasonInstance.summer.getSeasonName());
System.out.println(SeasonInstance.summer.getSeasonDesc());
}
}
//jdk5.0之前定义枚举类的方式
class SeasonInstance{
//2. 声明当前类的对象的实例变量
//声明当前类的对象的实例变量
private final String seasonName;//季节的名称
private final String seasonDesc;//季节的描述
//1. 私有化类的构造器
private SeasonInstance(String seasonName, String seasonDesc){
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
//3. 提供实例变量的get方法
public String getSeasonName() {
return seasonName;
}
public String getSeasonDesc() {
return seasonDesc;
}
//4. 创建当前类的实例
public static final SeasonInstance spring=new SeasonInstance("春天","春暖花开");
public static final SeasonInstance summer=new SeasonInstance("夏天","夏日炎炎");
public static final SeasonInstance autumn=new SeasonInstance("秋天","秋高气爽");
public static final SeasonInstance winter=new SeasonInstance("冬天","白雪皑皑");
@Override
public String toString() {
return "SeasonInstance{" +
"seasonName='" + seasonName + '\'' +
", seasonDesc='" + seasonDesc + '\'' +
'}';
}
}
结果:
格式:public enmu 枚举名{}
枚举常量定义:
枚举中的常量名字大写,多个常量之间逗号分开,最后一个常量可以写分号,也可以不写。每一个常量,都表示这个类的对象。修饰符为public static final
。
枚举中有默认的无参数的private修饰的构造方法,如果手写构造方法,也必须是私有修饰的。而且构造方法必须写在常量的后面,这时最后一个常量就必须要写分号。
public enum Color {
//枚举的静态常量
RED,GREEN,YELLOW
}
枚举的使用
由于枚举的常量为静态修饰可以直接枚举名.调用
public static void main(String[] args){
MyEnum myEnum = MyEnum.GREEN;
System.out.println(myEnum);
System.out.println(myEnum.getName());
}
代码:
package com.maven.pojo;
public class SeasonTest1 {
public static void main(String[] args) {
System.out.println(Season1.spring);
System.out.println(Season1.summer.getSeasonName());
System.out.println(Season1.summer.getSeasonDesc());
}
}
enum Season1{
//1. 必须在枚举类的开头声明多个对象,对象之间使用,隔开
spring("春天","春暖花开"),
summer("夏天","夏日炎炎"),
autumn("秋天","秋高气爽"),
winter("冬天","白雪皑皑");
//2. 声明当前类的对象的实例变量
//声明当前类的对象的实例变量
private final String seasonName;//季节的名称
private final String seasonDesc;//季节的描述
//1. 私有化类的构造器
private Season1(String seasonName, String seasonDesc){
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
//3. 提供实例变量的get方法
public String getSeasonName() {
return seasonName;
}
public String getSeasonDesc() {
return seasonDesc;
}
@Override
public String toString() {
return "SeasonInstance{" +
"seasonName='" + seasonName + '\'' +
", seasonDesc='" + seasonDesc + '\'' +
'}';
}
}
结果:
使用enum关键字定义的枚举类,默认其父类是java.lang.Enum类。
使用enum关键字定义的枚举类,不要再显示的定义其父类。否则报错。
String toString():默认返回的是常量名(对象名),可以继续手动重写该方法。
values():把我们的枚举类型转换成数组
public class test_day0119 {
public static void main(String[] args) {
//将枚举类型转换成数据
season[] arr1=season.values();
//利用foreach循环进行打印
for(season item:arr1){
System.out.println(item);
}
}
}
enum season{
SPRING,SUMMER,AUTUMN,WINTER
}
?结果
valueOf():将一个字符串变成我们的枚举类型,若我们原本的枚举类型里不包含该字符串转换后的枚举值,那么系统会报错提示。
ordinal():获得当前枚举类型的下标
public class test_day0119 {
public static void main(String[] args) {
//将枚举类型转换成数据
season[] arr1=season.values();
//利用foreach循环进行打印
for(season item:arr1){
int index=item.ordinal();
System.out.println(item+"index为:"+index);
}
}
}
enum season{
SPRING,SUMMER,AUTUMN,WINTER
}
?
1. 情况1:枚举类实现接口,在枚举类中重写接口中的抽象方法。当通过不同的枚举类对象调用此方法时,执行的是同一个方法。
2. 情况2:让枚举类的每一个对象重写接口中的抽象方法。当通过不同的枚举类对象调用此方法时,执行的是不同的实现方法。
package com.maven.pojo;
public class SeasonTest1 {
public static void main(String[] args) {
Season1[] values = Season1.values();
for (int i = 0; i < values.length; i++) {
values[i].show();
values[i].show1();
}
}
}
interface Info1{
void show();
void show1();
}
enum Season1 implements Info1{
//1. 必须在枚举类的开头声明多个对象,对象之间使用,隔开
spring("春天","春暖花开"){
@Override
public void show() {
System.out.println("春天在哪里");
}
},
summer("夏天","夏日炎炎"){
@Override
public void show() {
System.out.println("宁静的夏天");
}
},
autumn("秋天","秋高气爽"){
@Override
public void show() {
System.out.println("秋意浓");
}
},
winter("冬天","白雪皑皑"){
@Override
public void show() {
System.out.println("大约在冬季");
}
};
//2. 声明当前类的对象的实例变量
//声明当前类的对象的实例变量
private final String seasonName;//季节的名称
private final String seasonDesc;//季节的描述
//1. 私有化类的构造器
private Season1(String seasonName, String seasonDesc){
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
//3. 提供实例变量的get方法
public String getSeasonName() {
return seasonName;
}
public String getSeasonDesc() {
return seasonDesc;
}
@Override
public String toString() {
return "SeasonInstance{" +
"seasonName='" + seasonName + '\'' +
", seasonDesc='" + seasonDesc + '\'' +
'}';
}
@Override
public void show1() {
System.out.println("四季的变化");
}
}
结果:
1. 🥙练习1:定义公司中员工的就职状态:Busy(忙碌)\Free(空闲)\Vocation(休假)、Dimission(离职)
员工类
import lombok.*;
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Getter
@Setter
public class Employee {
private String name;
private int age;
private Status status;
}
?员工状态类:
//就职状态:Busy(忙碌)\Free(空闲)\Vocation(休假)、Dimission(离职)
public enum Status {
Busy,Free,Vocation,Dimission
}
测试类:
public class EmployeeTest {
public static void main(String[] args) {
Employee e1 = new Employee("Tom", 21, Status.Busy);
System.out.println(e1);
}
}
结果:
2. 🥙声明颜色枚举类:7个常量对象:RED,ORANGE,YELLOW,GREEN,CYAN,BLUE
public enum Color {
RED,ORANGE,YELLOW,GREEN,CYAN,BLUE
}