看到枚举后,在Java中混淆了类型声明

Confused about type declaration in Java after seeing enum

本问题已经有最佳答案,请猛点这里访问。

作为Java初学者,我被引入了枚举,这使我非常困惑于类型声明。我想分享我所知道的,这样你们中的一个可能会在我的想法中发现问题。

我知道有两种数据类型,原始数据类型和对象数据类型。声明变量时,首先编写数据类型,然后编写变量的标识符。

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

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

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

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

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

1
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.

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

如果枚举不是一个变量数据类型,而是一个类似关键字的类,那么我想知道以下思想是否正确:

1
2
3
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)

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

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


I can however declare an enum without a capital letter. Does this mean it is not an object?

不。

Or is an enumerator just a keyword like class and not a variable datatype like I assumed it to be.

enumclass一样,是一个关键字——见jls第8.9节。

An enum declaration specifies a new enum type, a special kind of class type.

枚举常量是枚举类型的实例,它反过来扩展了enum超类。

1
enum Test {EXAMPLE1, EXAMPLE2}

所以这里Test定义了一个枚举类型。example1和example2是枚举常量,它们是测试枚举类型的实例。运行时不能创建其他实例,但可以创建对这些实例的其他引用。

1
Test e = Test.EXAMPLE

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

Test.class是一个有意义的构造,它允许您访问由枚举声明定义的类实例。Test.EXAMPLE.class没有意义,e.class也没有意义,因为这些都是实例。Test.EXAMPLE.getClass()e.getClass()

很像java.lang.Boolean

1
Boolean b = Boolean.TRUE

但不是完全

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


欢迎使用StackOverflow!

您可以将EDCOX1 0作为一种特殊的Java类型,用于声明"常量组"。简单例子:

1
2
3
4
enum Language {
    PORTUGUESE,
    ENGLISH
}

用途:

1
2
3
4
5
Language yourLanguage = Language.ENGLISH;

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

在这种情况下,可以将Language视为枚举类型,将PORTUGUESEENGLISH视为该类型的常量。当您最终开始探索枚举的功能,而不仅仅是用名称定义这些常量时,更清楚的是这些常量实际上是对象,带有字段和方法。例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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);
    }
}

用途:

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