师父说:人活一世,每个人都有他的特别,每个人都值得被温柔相待。红尘一遭,每段经历都有它的必然,
每段经历都造就了现在的你,最快乐的事情,就是做自己,最浪漫的事情,就是爱自己。致自己,这段话永不过期。
没有别人天生好命,就要学会后天自己拼命,没有别人可以依靠,就要学会独立创造幸福。
路,是靠自己一步一步走的,钱,是靠自己一分分赚的。财富,需要勤劳的付出,辉煌,需要顽强的拼搏。
心酸,苦酒,自己品尝,大风大浪自己挡,靠自己,最争气。
有些事,不能尽如意,有些情,不会久燃不熄,日久不一定生情,但一定能够见人心。
感情不是你对他好,他就会懂你的用心良苦。你再优秀,也会有人对你不屑一顾,
你再平凡,也会有人把你视若生命,捂不热的心,就不要暖了,等不到的人,就不要等了。
谁若真心待你,你就拿命去珍惜。谁若对你无情,你就报之以绝情。想要的人生自己赚,
满意的幸福自己争取,不亏待每一份热情,不讨好任何的冷漠。
愿你成为自己的太阳,也愿你的身后总有力量,你期待的一切,都会如约而至。—————— 一禅心灵庙语
一个 枚举类型 是一种特殊的数据类型,使一个变量是一组预定义的常量。变量必须等于一个已经预定义的值。常见的例子包括罗盘方向(NORTH、SOUTH、EAST 和 WEST 的值)和一周的几天。
因为它们是常量,枚举类型的字段的名称是大写字母。
对于类的对象有限,并且确定的,才可以使用 枚举类型 ,如:
星期:Monday(星期一)、…、Sunday(星期天)
性别:Man(男)、Woman(女)
季节:Spring(春节)…Winter(冬天)
支付方式:Cash(现金)、WeChatPay(微信)、Alipay(支付宝)、BankCard(银 行卡)、CreditCard(信用卡)
就职状态:Busy、Free、Vocation、Dimission
订单状态:Nonpayment(未付款)、Paid(已付款)、Delivered(已发货)、
Return(退货)、Checked(已确认)Fulfilled(已配货)、
线程状态:创建、就绪、运行、阻塞、死亡
像 一天中是温度变化,就仅仅是在一个范围内,是有限的,但是却不是确定的 。
枚举类的实现:
JDK1.5 之前需要自定义枚举类。
JDK1.5 新增的 enum 关键字用于定义枚举类。
若枚举只有一个对象,则可以作为一种单例模式的实现方式。
枚举类的属性
private final
修饰private final
修饰的属性应该在构造器中为其赋值,注意: 了 对于 final 修饰的属性/变量 必须赋值,如果不赋值,会报异常。public static final
private final
,并在构造器中初始化。举例: 基于 JDK5.0 之前的方式:自定义一个枚举类,一个关于四季的枚举类型。
package blogs.blog6;class Season {// 1.创建枚举类中的含有的特定的属性: 注意是被: private final 修饰的,也可以没有枚举类特有的属性private final String stringName;private final String stringDesc;// 2.创建枚举类常量: 注意是: public static final 修饰的,常量所有字母大写的// 被 static 修饰,静态的和类一起加载到内存当中,仅仅只会加载一次,所以对象共用,可以直接使用 "类名.常量"的方式访问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("冬天","冰天雪地");// 3. 构造器私有化: 将枚举类定义的特定的被 final 修饰的属性,附上值。// 注意: 被 final 修饰的属性/变量,必须赋值,不然报异常private Season(String stringName, String stringDesc) {this.stringName = stringName;this.stringDesc = stringDesc;}// 4. 其他诉求的方法的定义: 这里我们定义一个获取 属性的get方法// 因为属性被 final 修饰了,所以我们不需要创建 set方法public String getStringName() {return stringName;}public String getStringDesc() {return stringDesc;}// 或者来一个重写 toString()方法@Overridepublic String toString() {return "Season{" +"stringName='" + stringName + '\'' +", stringDesc='" + stringDesc + '\'' +'}';}
}public class EnumTest {public static void main(String[] args) {// 访问自定义的枚举类型的常量,static 静态的,使用类名.常量名System.out.println(Season.AUTUMN);System.out.println(Season.SPRING);System.out.println(Season.SUMMER);System.out.println(Season.WINTER);}}
在 Java 编程语言中,基于 JDK5.0 的前提下,您可以使用 enum 关键字定义枚举类型。
使用说明:
enum
定义的枚举类 默认继承 了 java.lang.Enum
类,因此不能再继承其他类。private
权限修饰符。(,分隔 ; 结尾)
. 列出的实例系统会 自动添加 public static final 修饰,举例: 基于上述:自定义一个枚举类,一个关于四季的枚举类型。上面我们使用的是在 JDK 5.0 之前自行定义的方式,这里我们基于 JDK 5.0以后的方式创建。
package blogs.blog6;// 使用JDK5.0 新特性中的定义枚举类关键字 enum
enum Season2 {// 1. 首先将枚举类中的常量定义在第一行,如果不是定义在定义行的话,编译报错的// 省略了 public static final Season 和 new Season的// public static final Season SPRING = new Season("春天", "春暖花开");SPRING("春天", "春暖花开"), // 注意: 因为要定义在第一行,所以枚举常量之间使用","逗号分隔SUMMER("夏天", "夏日炎炎"),AUTUMN("秋天", "秋高气爽"),WINTER("冬天", "冰天雪地"); // 最后使用,“;”分号结束 枚举常量的定义// 2. 定义枚举类型特有的属性// 注意: 被 private final 修饰防止被修改,这个根据需求设定就好,可以没有private final String stringName;private final String stringDesc;// 3. 私有化构造器(因为定义了枚举类特定的属性,所以需要额外定义构造器为其赋值),没有特定属性的话,可以省略的// final 必须赋值,不然报异常private Season2(String stringName, String stringDesc) {this.stringName = stringName;this.stringDesc = stringDesc;}// 4.处理特定的诉求 这里我们定义 get方法()// 因为 特定的属性被 final 修饰了,所以不用定义 set的public String getStringName() {return stringName;}public String getStringDesc() {return stringDesc;}}public class EnumTest2 {public static void main(String[] args) {System.out.println(Season2.SPRING);System.out.println(Season2.AUTUMN);System.out.println(Season2.SUMMER);System.out.println(Season2.WINTER);}}
注意: 这里的 enum 类继承的不是 Object 类,而是 java.lang.Enum
类中的,所以 Season2.SPRING 枚举常量类中没有重写 toStirng()方法的前提下,调用的是 java.lang.Enum 类中的 toString()方法,返回的是 枚举常量名。 所以结果就如上图中的 : SPRING,AUTUMN,SUMMER,WINTER 的枚举常量名。
// 使用JDK5.0 新特性中的定义枚举类关键字 enum
enum Season2 {// 1. 首先将枚举类中的常量定义在第一行,如果不是定义在定义行的话,编译报错的// 省略了 public static final Season 和 new Season的// public static final Season SPRING = new Season("春天", "春暖花开");SPRING("春天", "春暖花开"), // 注意: 因为要定义在第一行,所以枚举常量之间使用","逗号分隔SUMMER("夏天", "夏日炎炎"),AUTUMN("秋天", "秋高气爽"),WINTER("冬天", "冰天雪地"); // 最后使用,“;”分号结束 枚举常量的定义// 2. 定义枚举类型特有的属性// 注意: 被 private final 修饰防止被修改,这个根据需求设定就好,可以没有private final String stringName;private final String stringDesc;// 3. 私有化构造器(因为定义了枚举类特定的属性,所以需要额外定义构造器为其赋值),没有特定属性的话,可以省略的// final 必须赋值,不然报异常private Season2(String stringName, String stringDesc) {this.stringName = stringName;this.stringDesc = stringDesc;}// 4.处理特定的诉求 这里我们定义 get方法()// 因为 特定的属性被 final 修饰了,所以不用定义 set的public String getStringName() {return stringName;}public String getStringDesc() {return stringDesc;}}public class EnumTest2 {public static void main(String[] args) {// 打印其中的 enum 的父类System.out.println(Season2.class.getSuperclass());}
}
JDK 1.5 中可以在 switch 表达式中使用Enum定义的枚举类的对象作为表达式, case 子句可以直接使用枚举值的名字, 无需添加枚举
类作为限定。
举例: 将指定一个星期的枚举类型为:
// 静态常量,导入对于特定的包,对于静态常量可以省略类名,直接使用常量名的方式
import static blogs.blog6.Day.SUNDAY;// 枚举类型也是可以被权限修饰符修饰的
enum Day {SUNDAY,MONDAY,TUESDAY,WEDNESDAY, // 枚举常量大写字母,必须定义在第一行当中,使用“,”逗号分隔开,THURSDAY,FRIDAY,SATURDAY; // 最后“;” 分号结尾}public class EnumTest3 {public void tellItLikeItIs(Day day) {switch (day) {case MONDAY:System.out.println("星期一是糟糕的");break;case FRIDAY:System.out.println("星期五是最爽的");break;case SATURDAY:case SUNDAY:System.out.println("周末是最最安逸的");break;default:System.out.println("其他时间一般");break;}}public static void main(String[] args) {// 静态方法调用非静态方法EnumTest3 enumTest3 = new EnumTest3();enumTest3.tellItLikeItIs(Day.MONDAY);enumTest3.tellItLikeItIs(Day.WEDNESDAY);enumTest3.tellItLikeItIs(Day.FRIDAY);enumTest3.tellItLikeItIs(Day.SATURDAY);enumTest3.tellItLikeItIs(SUNDAY);}
}
注意: 这里的方法是,基于 JDK5.0 enum 关键字定义的枚举类才有的方法。
举例:
// 使用JDK5.0 新特性中的定义枚举类关键字 enum
enum Season2 {// 1. 首先将枚举类中的常量定义在第一行,如果不是定义在定义行的话,编译报错的// 省略了 public static final Season 和 new Season的// public static final Season SPRING = new Season("春天", "春暖花开");SPRING("春天", "春暖花开"), // 注意: 因为要定义在第一行,所以枚举常量之间使用","逗号分隔SUMMER("夏天", "夏日炎炎"),AUTUMN("秋天", "秋高气爽"),WINTER("冬天", "冰天雪地"); // 最后使用,“;”分号结束 枚举常量的定义// 2. 定义枚举类型特有的属性// 注意: 被 private final 修饰防止被修改,这个根据需求设定就好,可以没有private final String stringName;private final String stringDesc;// 3. 私有化构造器(因为定义了枚举类特定的属性,所以需要额外定义构造器为其赋值),没有特定属性的话,可以省略的// final 必须赋值,不然报异常private Season2(String stringName, String stringDesc) {this.stringName = stringName;this.stringDesc = stringDesc;}// 4.处理特定的诉求 这里我们定义 get方法()// 因为 特定的属性被 final 修饰了,所以不用定义 set的public String getStringName() {return stringName;}public String getStringDesc() {return stringDesc;}// 重写toString方法@Overridepublic String toString() {return "Season2{" +"stringName='" + stringName + '\'' +", stringDesc='" + stringDesc + '\'' +'}';}
}public class EnumTest2 {public static void main(String[] args) {Season2[] season2s = Season2.values(); // 返回枚举类中所有的常量值,存储到枚举类数组中// 遍历获取到其中,枚举类数组for(int i = 0; i < season2s.length; i++) {System.out.println(season2s[i]); // 如果重写了toString()方法,就调用的是重写的toString()方法}}
}
举例:
// 使用JDK5.0 新特性中的定义枚举类关键字 enum
enum Season2 {// 1. 首先将枚举类中的常量定义在第一行,如果不是定义在定义行的话,编译报错的// 省略了 public static final Season 和 new Season的// public static final Season SPRING = new Season("春天", "春暖花开");SPRING("春天", "春暖花开"), // 注意: 因为要定义在第一行,所以枚举常量之间使用","逗号分隔SUMMER("夏天", "夏日炎炎"),AUTUMN("秋天", "秋高气爽"),WINTER("冬天", "冰天雪地"); // 最后使用,“;”分号结束 枚举常量的定义// 2. 定义枚举类型特有的属性// 注意: 被 private final 修饰防止被修改,这个根据需求设定就好,可以没有private final String stringName;private final String stringDesc;// 3. 私有化构造器(因为定义了枚举类特定的属性,所以需要额外定义构造器为其赋值),没有特定属性的话,可以省略的// final 必须赋值,不然报异常private Season2(String stringName, String stringDesc) {this.stringName = stringName;this.stringDesc = stringDesc;}// 4.处理特定的诉求 这里我们定义 get方法()// 因为 特定的属性被 final 修饰了,所以不用定义 set的public String getStringName() {return stringName;}public String getStringDesc() {return stringDesc;}// 重写toString方法@Overridepublic String toString() {return "Season2{" +"stringName='" + stringName + '\'' +", stringDesc='" + stringDesc + '\'' +'}';}
}public class EnumTest2 {public static void main(String[] args) {Season2 season2 = Season2.valueOf("SPRING"); // valueOf()类方法,返回对应枚举常量名的对象System.out.println(season2);}
}
如果不是 valueOf(String name)
参数的字符串名,必须是对应枚举类中所存在的枚举常量名,如果不是,报:java.lang.IllegalArgumentException
异常
和普通 Java 类一样,枚举类可以实现一个或多个接口。若每个枚举值在调用实现的接口方法呈现相同的行为方式,则只要统一实现该方法即可。
若需要每个枚举值在调用实现的接口方法呈现出不同的行为方式,,则可以让每个枚举值分别来实现该方法。
举例: 这里我们定义一个 inof 接口,其中定义一个 show() 抽象方法, 再定义一个 enum 枚举类,实现该接口,并重写其中的 show()重写方法。做到每个枚举值(枚举常量值)在调用实现的接口 show()方法呈现出不同的行为方式,
interface Info {public abstract void show();}// enum 枚举类 implements 接口
enum Season5 implements Info {// 1. 首先将枚举类中的常量定义在第一行,如果不是定义在定义行的话,编译报错的// 省略了 public static final Season 和 new Season的// public static final Season SPRING = new Season("春天", "春暖花开");SPRING("春天", "春暖花开") {// 枚举值(枚举常量值)实现对应接口的抽象方法@Overridepublic void show() {System.out.println("找春天");}}, // 注意: 因为要定义在第一行,所以枚举常量之间使用","逗号分隔SUMMER("夏天", "夏日炎炎") {@Overridepublic void show() {System.out.println("夏日,蝉鸣");}},AUTUMN("秋天", "秋高气爽") {@Overridepublic void show() {System.out.println("秋日,枫叶飞舞");}},WINTER("冬天", "冰天雪地") {@Overridepublic void show() {System.out.println("冬日,雪花飞舞");}}; // 最后使用,“;”分号结束 枚举常量的定义// 2. 定义枚举类型特有的属性// 注意: 被 private final 修饰防止被修改,这个根据需求设定就好,可以没有private final String stringName;private final String stringDesc;// 3. 私有化构造器(因为定义了枚举类特定的属性,所以需要额外定义构造器为其赋值),没有特定属性的话,可以省略的// final 必须赋值,不然报异常private Season5(String stringName, String stringDesc) {this.stringName = stringName;this.stringDesc = stringDesc;}// 4.处理特定的诉求 这里我们定义 get方法()// 因为 特定的属性被 final 修饰了,所以不用定义 set的public String getStringName() {return stringName;}public String getStringDesc() {return stringDesc;}// 重写toString方法@Overridepublic String toString() {return "Season5{" +"stringName='" + stringName + '\'' +", stringDesc='" + stringDesc + '\'' +'}';}
}public class EnumTest5 {public static void main(String[] args) {Season5[] values = Season5.values(); // 静态方法/类方法:获取到对应枚举类中所有的枚举值(枚举常量值),并存储在数组中for(int i = 0; i < values.length; i++) {values[i].show(); // 调用对应枚举值(枚举常量值)中特有的方法}}
}
enum
其中枚举值,省略了 public static final Season 和 new Season的 // 省略了 public static final Season 和 new Season的// public static final Season SPRING = new Season("春天", "春暖花开");SPRING("春天", "春暖花开"),
","
号分隔开,最后一个枚举值,使用“;”
分号结束。java.lang.Enum
抽象类,不是 Object 的类。限于自身水平,其中存在的错误,希望大家给予指教,韩信点兵——多多益善,谢谢大家,江湖再见,后会有期 !!!
上一篇:梯度之上:Hessian 矩阵
下一篇:Nacos集群搭建