【问题标题】:Confused about type declaration in Java after seeing enum [duplicate]看到枚举后对Java中的类型声明感到困惑[重复]
【发布时间】:2019-02-13 08:00:54
【问题描述】:

作为一名 Java 初学者,我被介绍给枚举,这让我对类型声明感到非常困惑。我想分享我所知道的,这样你们中的一个人可能会发现我认为的问题。

我了解到有两种数据类型,原始数据类型和对象数据类型。声明变量时,先写datatype,再写变量的identifier

当我声明一个数据类型 int 变量时,我的脑海里有以下想法:

int a = 1; int as datatype references to the primitive integer datatype.

当我声明一个数据类型 Integer 变量时,我脑子里有以下想法:

Integer b =  1;  Integer as datatype references to the object datatype (that in this case is an instance of the class integer)

当我声明一个枚举器变量时,我脑子里有以下想法:

enum C {EXAMPLE1, EXAMPLE2}; No clue what enum references to.. Is it an object datatype and an instance of class enum? If so, where is the capital letter E in enum.

所以问题就从这里开始了。我了解到 enum 不是原始数据类型,所以唯一的可能性是它是一个对象。但我也了解到,将类的对象声明为数据类型意味着标识符应该以大写字母开头,如 Integer、Boolean 等。但是,我可以声明一个没有大写字母的枚举。这是否意味着它不是一个对象?或者枚举器只是类之类的关键字,而不是我假设的变量数据类型。

如果 enum 不是变量数据类型,而是像 class 这样的关键字,那么我想知道以下思维方式是否正确:

enum Test {EXAMPLE1, EXAMPLE2}
Test e = Test.EXAMPLE; Does Test reference to the object datatype? (That 
in this case is an instance of the enumerator Test) 

如果 Test 是枚举器 Test 的一个实例,这怎么可能?我只认为可以从类中创建对象,但我也读过一些关于枚举器中的构造函数的内容。

我一直在寻找这个问题的答案几个小时,但没有成功。我希望我现在还没有弄乱你的头。但我真的希望有人能理解这一点并真正帮助我。

【问题讨论】:

  • 想问一下:这和 C# 有什么关系?
  • 顺便说一句,大写只是一种约定,实际上并没有任何作用。
  • 我不太熟悉 C#,但我经常听说 C# 和 Java 在语法上是相关的。懂 C# 的人可能也会理解我的问题并帮助我。
  • 对于 Java/C# 而言,不幸的是枚举是它们非常不同的少数领域之一。
  • 在 Java 中,枚举是具有称为序数的后备整数的对象。在 C# 中,枚举基本上是一个命名的 int(它实际上可以是任何原始数据类型)。 C# 枚举更类似于 C/C++ 的枚举,不同之处在于它们的名称被存储。

标签: java enums


【解决方案1】:

但是,我可以声明一个没有大写字母的枚举。这是否意味着它不是一个对象?

没有。

或者是一个枚举器,它只是一个类似于 class 的关键字,而不是我认为的变量数据类型。

enumclass 一样,是一个关键字——参见JLS section 8.9

枚举声明指定了一个新的枚举类型,一种特殊的类类型。

枚举常量是枚举类型的实例,它又扩展了Enum 超类。

enum Test {EXAMPLE1, EXAMPLE2}

所以这里Test 定义了一个枚举类型。示例 1 和示例 2 是枚举常量,它们是 Test 枚举类型的实例。在运行时无法创建其他实例,但您可以创建对这些实例的其他引用。

Test e = Test.EXAMPLE

所以这里,局部变量e指向枚举常量; eTest.EXAMPLE 在内存中具有相同的地址,可以这么说。

Test.class 是一种有意义的构造——它使您可以访问由枚举声明定义的类实例。 Test.EXAMPLE.class 没有意义,e.class 也没有意义,因为它们是实例Test.EXAMPLE.getClass()e.getClass()

很像java.lang.Boolean

Boolean b = Boolean.TRUE

但不完全是

Boolean b = new Boolean(true); // OK
Test    t = new Test(); // NOT ALLOWED

【讨论】:

  • 非常感谢 ;) 在看到编译器如何处理枚举并且您提到常量是实例之后,这对我来说都是有意义的。
【解决方案2】:

欢迎来到 StackOverflow!

您可以将enum 视为一种特殊的Java 类型,用于声明“常量组”。简单例子:

enum Language {
    PORTUGUESE,
    ENGLISH
}

用法:

Language yourLanguage = Language.ENGLISH;

if (language == Language.ENGLISH) {
    System.out.println("Hi!");
}

就此而言,您可以将Language 视为枚举类型,将PORTUGUESEENGLISH 视为此类型的常量。当您最终开始探索枚举的功能,而不仅仅是通过名称定义这些常量时,会更清楚这些常量确实是对象,具有字段和方法。示例:

enum Language {
    PORTUGUESE("Olá!"), // Call to constructor initializing PORTUGUESE instance
    ENGLISH("Hi!");   // Call to constructor initializing ENGLISH instance

    private final String greeting; // Instance field

    // Constructor!
    Language(String greeting) {
        this.greeting = greeting;
    }

    public void greet() {
        System.out.println(greeting);
    }
}

用法:

Language yourLang = Language.ENGLISH;
yourLang.greet();

【讨论】:

  • @EmreGülten np!您介意选择一个答案并将其标记为已接受吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-26
  • 2020-02-25
  • 1970-01-01
  • 2016-02-13
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
相关资源
最近更新 更多