全文小万字心血只为给小白全方位拆解——枚举类Ⅱ(已完结)

前言:

书接上回,我们前半篇讲了

①枚举类是什么(举了很多例子),

又分类(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

那么小编对于枚举类的全方位拆解到此为止了就。我们下一篇继续分享其他有用的内容!!

                                ———键盘敲烂,月薪过万!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值