前言:
书接上回,我们前半篇讲了
①枚举类是什么(举了很多例子),
又分类(jdk5.0前后俩个版本)讲述了②如何实现枚举类,我们同样通过简单的一些代码实例,并对代码中重要难懂的部分做了解释。
再然后,③我们对枚举类的一个关键字 enum 方式定义的7条要求和特点,分别做了详细的人话拆解和代码实例表现。
我们上半篇讲到了 “ enum 中常用方法 ” 。
小编真的费了好多时间精力,认认真真做这个事情。希望大家给我一个 免费的赞 或者 关注 吧!!!!(我们一起进步,一起变好!!!)
enum 中常用方法
概述与总结:(咱们先都列出来,再一个一个做解释,举例子)
①String toString(): 默认返回的是常量名(对象名),可以继续手动重写该方法! static 枚举类型[]
②values():返回枚举类型的对象数组。该方法可以很方便地遍历 所有的枚举值,是一个静态方法
③static 枚举类型 valueOf(String name):可以把一个字符串转为对应的枚举类对 象。要求字符串必须是枚举类对象的“名字”。
如不是,会有运行时异常:IllegalArg umentException。
④String name():得到当前枚举常量的名称。建议优先使用toString()。
⑤int ordinal():返回当前枚举常量的次序号,默认从0开始
① String toString()
概述:
在Java中,每个对象都有一个toString()方法,它默认返回对象的类名和哈希码。
对于枚举类型,默认的toString()方法会返回枚举常量的名字。但是我们可以重写这个方法来让它返回我们想要的信息。
大白话拆解解释:
现在有一个玩具盒,里面有很多不同类型的玩具。每个玩具都有自己的名字。toString()就像是问玩具“你叫什么名字?”。对于枚举来说,如果你不特别告诉它怎么回答这个问题,它只会说“我叫某某某”(这里某某某是枚举的名字)。但是你可以教它用不同的方式来回答。
举个栗子:
enum Color {
RED, GREEN, BLUE;
@Override
public String toString() {
return "Color is " + super.toString().toLowerCase();
}
}
public class Main {
public static void main(String[] args) {
System.out.println(Color.RED); // 输出: Color is red
}
}
代码解释和总结:
枚举定义:
enum Color {
RED, GREEN, BLUE;
- 这里定义了一个名为Color的枚举,它包含了三个枚举常量:RED、GREEN和BLUE。每个枚举常量都是Color类型的实例,并且是唯一的。
重写 toString() 方法:
@Override
public String toString() {
return "Color is " + super.toString().toLowerCase();
}
- @Override: 这是一个注解,表示下面的方法是在重写父类中的方法。在这里,我们重写了从Object类继承来的toString()方法。
- super.toString(): 调用的是来自Object类的默认toString()实现。对于枚举类型,默认的toString()方法会返回枚举常量的名字。例如,对于Color.RED,super.toString()将返回字符串"RED"。
- .toLowerCase(): 这个方法将字符串转换为全小写。因此,super.toString().toLowerCase()将会把"RED"转换成"red","GREEN"转换成"green",依此类推。
- "Color is " + ...: 这是自定义的部分,我们在前面加上了固定的文本"Color is ",然后连接上转换为小写的颜色名称。
主程序:
public class Main {
public static void main(String[] args) {
System.out.println(Color.RED); // 输出: Color is red
}
}
- main方法是Java应用程序的入口点。
- System.out.println(Color.RED):这行代码打印Color.RED的字符串表示形式。因为Color枚举重写了toString()方法,所以实际上调用了我们自定义的toString()方法,输出结果将是"Color is red"。
②values():
概述:
values()是一个静态方法,它可以返回枚举类型的所有实例的数组。这使得我们可以很容易地遍历所有的枚举值。
大白话拆解和解释:
假设你有一盒蜡笔,里面有红、绿、蓝三种颜色。values()就像打开蜡笔盒,把所有蜡笔都拿出来放在桌子上,这样你可以看到所有的颜色。
举个栗子:
enum Season {
SPRING, SUMMER, AUTUMN, WINTER;
}
public class Main {
public static void main(String[] args) {
for (Season s : Season.values()) {
System.out.println(s);
}
// 输出:
// SPRING
// SUMMER
// AUTUMN
// WINTER
}
}
代码解释和总结:
枚举定义:
enum Season {
SPRING, SUMMER, AUTUMN, WINTER;
}
- 这里定义了一个名为Season的枚举,它包含了四个枚举常量:SPRING、SUMMER、AUTUMN和WINTER。每个枚举常量都是Season类型的实例,并且是唯一的。
遍历枚举实例:
for (Season s : Season.values()) {
System.out.println(s);
}
- for (Season s : Season.values()): 这是一个增强型for循环(也称为for-each循环),它用于遍历数组或集合中的元素。这里的Season.values()返回了Season枚举的所有实例组成的数组,因此这个循环将依次访问每一个枚举实例。
- System.out.println(s): 在每次迭代中,当前枚举实例s被传递给System.out.println()方法,这将打印出该枚举实例的字符串表示形式。默认情况下,枚举的toString()方法会返回枚举常量的名字,所以输出将是SPRING、SUMMER、AUTUMN和WINTER。
输出结果:
SPRING
SUMMER
AUTUMN
WINTER
小结:
- values()方法是Java枚举的一个非常有用的方法,它允许我们轻松地获取并遍历枚举的所有实例。这对于需要处理一组固定的、命名的值的情况特别有用,比如季节、星期几、状态码等。通过结合增强型for循环,我们可以方便地对这些枚举实例进行操作,如打印、比较或执行特定逻辑。
③static 枚举类型 valueOf(String name):
概述:
- valueOf(String name)也是一个静态方法,它允许你通过给定的字符串名称找到对应的枚举实例。如果提供的字符串不是任何枚举实例的名称,那么将会抛出IllegalArgumentException异常。
大白话拆解和解释:
- 继续用蜡笔的例子,如果你知道你想用的颜色名字,比如“红色”,你就可以直接说出这个名字来得到那支红色的蜡笔。但是如果你说了一个不存在的颜色,比如“紫色”,而你的蜡笔盒里没有紫色的蜡笔,那么你就会被告知“对不起,没有这种颜色”。
举个栗子:
enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}
public class Main {
public static void main(String[] args) {
Day day = Day.valueOf("MONDAY");
System.out.println(day); // 输出: MONDAY
try {
Day invalidDay = Day.valueOf("INVALID_DAY"); // 这将抛出异常
} catch (IllegalArgumentException e) {
System.out.println("找不到名为 INVALID_DAY 的枚举值");
}
}
}
代码解释和总结:
枚举定义:
enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}
- 这里定义了一个名为Day的枚举,它包含了七个枚举常量,分别代表一周中的每一天。每个枚举常量都是Day类型的实例,并且是唯一的。
使用 valueOf() 获取枚举实例:
Day day = Day.valueOf("MONDAY");
System.out.println(day); // 输出: MONDAY
- Day.valueOf("MONDAY"):调用Day枚举的valueOf方法,传入字符串"MONDAY"。因为Day枚举中确实存在名为MONDAY的常量,所以这个方法调用将返回Day.MONDAY枚举实例。
- System.out.println(day):打印day的字符串表示形式,即"MONDAY"。
处理无效的枚举名称:
try {
Day invalidDay = Day.valueOf("INVALID_DAY"); // 这将抛出异常
} catch (IllegalArgumentException e) {
System.out.println("找不到名为 INVALID_DAY 的枚举值");
}
- Day.valueOf("INVALID_DAY"):尝试使用一个不存在于Day枚举中的字符串"INVALID_DAY"来调用valueOf方法。由于没有名为INVALID_DAY的枚举常量,这将导致IllegalArgumentException被抛出。
- try-catch 块:用于捕获并处理可能发生的IllegalArgumentException。在这个例子中,当异常发生时,程序不会崩溃,而是执行catch块中的代码,输出一条友好的错误消息"找不到名为 INVALID_DAY 的枚举值"。
④String name():
得到当前枚举常量的名称。建议优先使用toString()
概述:
name()方法返回当前枚举常量的名称。与toString()不同的是,name()总是返回原始的枚举常量名称,不会受到toString()重写的影响。
大白话拆解和解释:
还是用蜡笔的例子,name()就是直接告诉你蜡笔原本的名字,不管你有没有给蜡笔取过别名。
举个栗子:
enum Size {
SMALL, MEDIUM, LARGE;
@Override
public String toString() {
return "Size: " + super.name().toLowerCase();
}
}
public class Main {
public static void main(String[] args) {
Size size = Size.SMALL;
System.out.println(size.name()); // 输出: SMALL
System.out.println(size); // 输出: Size: small
}
}
代码解释和总结:
枚举定义:
enum Size {
SMALL, MEDIUM, LARGE;
@Override
public String toString() {
return "Size: " + super.name().toLowerCase();
}
}
- 这里定义了一个名为Size的枚举,它包含了三个枚举常量:SMALL、MEDIUM和LARGE。每个枚举常量都是Size类型的实例,并且是唯一的。
name() 方法:
概述:
name() 是一个由Java编译器自动为所有枚举类型添加的方法。这个方法返回枚举常量的名称,作为一个字符串,并且总是返回原始声明时的名称(即大小写敏感)。对于Size.SMALL,name()将返回字符串"SMALL"。
- 返回值:一个表示枚举常量名字的字符串,区分大小写。
- 特点:name()方法不会受到重写的toString()方法的影响,它始终返回原始的枚举常量名字。
自定义 toString() 方法:
@Override
public String toString() {
return "Size: " + super.name().toLowerCase();
}
- @Override:这是一个注解,表示下面的方法是在重写父类中的方法。在这里,我们重写了从Object类继承来的toString()方法。
- super.name():调用的是来自枚举类型的name()方法,用于获取枚举常量的名字。例如,对于Size.SMALL,super.name()将返回字符串"SMALL"。
- .toLowerCase():这个方法将字符串转换为全小写。因此,super.name().toLowerCase()将会把"SMALL"转换成"small","MEDIUM"转换成"medium",依此类推。
- "Size: " + ...:这是自定义的部分,我们在前面加上了固定的文本"Size: ",然后连接上转换为小写的大小名称。
主程序:
public class Main {
public static void main(String[] args) {
Size size = Size.SMALL;
System.out.println(size.name()); // 输出: SMALL
System.out.println(size); // 输出: Size: small
}
}
- size.name():直接调用了Size枚举的name()方法,这将返回枚举常量SMALL的名字,即字符串"SMALL"。
- System.out.println(size.name()):打印出"SMALL"。
- System.out.println(size):当打印枚举实例时,实际上调用了该实例的toString()方法。由于我们重写了toString()方法,所以输出将是"Size: small"。
⑤int ordinal():
返回当前枚举常量的次序号,默认从0开始
概述:
- ordinal()方法返回枚举常量的次序号,即它是定义在枚举中的第几个元素,从0开始计数。
大白话拆解和解释:
- 如果你按照顺序给蜡笔编号,ordinal()就是告诉你这支蜡笔是第几号。比如,如果你有三支蜡笔,它们分别是第一、第二和第三支,那么它们的ordinal()值就是0、1和2。
举个栗子:
enum Direction {
NORTH, SOUTH, EAST, WEST;
}
public class Main {
public static void main(String[] args) {
for (Direction d : Direction.values()) {
System.out.println(d + " has ordinal " + d.ordinal());
}
// 输出:
// NORTH has ordinal 0
// SOUTH has ordinal 1
// EAST has ordinal 2
// WEST has ordinal 3
}
}
代码解释和总结:
枚举定义:
enum Direction {
NORTH, SOUTH, EAST, WEST;
}
- 这里定义了一个名为Direction的枚举,它包含了四个枚举常量:NORTH、SOUTH、EAST和WEST。每个枚举常量都是Direction类型的实例,并且是唯一的。这些常量按照它们在枚举中声明的顺序进行编号。
ordinal() 方法:
概述:
ordinal() 是一个由Java编译器自动为所有枚举类型添加的方法。这个方法返回枚举常量的序数值,表示该常量在枚举声明中的位置,从0开始计数。例如:
- Direction.NORTH.ordinal() 返回 0,因为它是第一个声明的枚举常量。
- Direction.SOUTH.ordinal() 返回 1,因为它是在NORTH之后声明的第二个枚举常量。
- Direction.EAST.ordinal() 返回 2,因为它是在SOUTH之后声明的第三个枚举常量。
- Direction.WEST.ordinal() 返回 3,因为它是在EAST之后声明的第四个枚举常量。
- 返回值: 一个整数,表示枚举常量在其枚举类型中的位置,从0开始。
遍历枚举实例并打印序数:
for (Direction d : Direction.values()) {
System.out.println(d + " has ordinal " + d.ordinal());
}
- Direction.values():这是一个静态方法,返回一个包含Direction枚举所有实例的数组,按它们在枚举中声明的顺序排列。
- for (Direction d : Direction.values()):这是一个增强型for循环(也称为for-each循环),它用于遍历Direction.values()返回的数组。每次迭代时,变量d将依次引用数组中的每个枚举常量。
- System.out.println(d + " has ordinal " + d.ordinal()):这行代码打印出当前枚举常量的名字以及它的序数值。d直接调用默认的toString()方法(即枚举常量的名字),而d.ordinal()则调用ordinal()方法获取序数值。
输出结果:
NORTH has ordinal 0
SOUTH has ordinal 1
EAST has ordinal 2
WEST has ordinal 3
那么小编对于枚举类的全方位拆解到此为止了就。我们下一篇继续分享其他有用的内容!!
———键盘敲烂,月薪过万!!!