【问题标题】:How enum works in Java?枚举在 Java 中是如何工作的?
【发布时间】:2022-07-21 17:42:12
【问题描述】:

例如,我试图了解 enum 在 Java 中的工作原理

public class CardSuitTest{

    public static void main(String[] args) {
        CardSuit suit = CardSuit.HEART;
        System.out.println(suit);
    }
}

enum CardSuit{
    HEARTS,
    DIAMONDS,
    CLUBS,
    SPADES,
}

我对一些理解感到困惑..!

  1. CardSuit 中定义的枚举常量(HEARTS、DIAMOND 等)的类型是什么?这些是特定的枚举 type 吗?

  2. 如果常量是枚举类型,System.prinltn(CardSuit.HEART) 怎么会打印 "HEART" 的文字字符串?所有枚举常量都是字符串类型吗?对这部分更困惑

  3. 当我喜欢 CardSuit.valueOf(“HEARTS”) 时,但它试图做什么?它只是想创建一个名为HEARTS 的enum type 常量吗?

【问题讨论】:

  • 1.类型 = CardSuit 2. 它调用默认的 toString() 方法,就像每个对象一样,对于枚举,它返回 name(),这反过来又是例如HEARTS。 3. 枚举是单例实例。 CardSuit.valueOf(“HEARTS”) 基本上迭代枚举 CardSuit 的定义值并返回与名称匹配的实例
  • 1.它们是CardSuit 类型,扩展Enum<CardSuit> 2. 将对象转换为String 涉及toString 方法。枚举有一个 name() 方法,它返回常量的名称。猜猜默认的toString 实现返回什么? 3. 它不是创建它,它只是返回具有匹配name() 的枚举常量。
  • 参考Oracle的Java教程:Enum Types

标签: java enums


【解决方案1】:

HEARTS、DIAMONDS、CLUBS 和 SPADES 的类型只是 CardSuit。这是java.lang.Enum的子类型。

System.out.println(CardSuit.HEART) 打印HEART 仅仅是因为Enum.toString() 被定义为返回您调用它的枚举值的名称(并且println(Object) 被定义为在传递给它的任何非空值上调用toString() )。

CardSuit.valueOf("HEARTS") 要求获取与名称 "HEARTS" 对应的枚举值(最终将与您可以通过 CardSuit.HEARTS 访问的值完全相同。请注意,此不会创建一个新的CardSuit 对象,但返回一个现有的对象。这一事实实际上是关于枚举的核心之一:只有是您在创建类时定义的值,即在您的情况下,只能有 4 个不同的 CardSuit 对象。不能在运行时创建新对象。

【讨论】:

    猜你喜欢
    • 2023-03-22
    • 1970-01-01
    • 2010-10-25
    • 2017-08-16
    • 2020-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-28
    相关资源
    最近更新 更多