看到枚举后对Java中的类型声明感到困惑

时间:2018-09-08 02:28:17

标签: java enums

作为Java的初学者,我被引入了枚举,这让我真的对类型声明感到困惑。我想分享我所知道的,以便你们中的一个人可能会以我的思维方式发现问题。

我了解到有两种数据类型,原始数据类型和对象数据类型。声明变量时,您首先要写数据类型,然后是变量的标识符

当我声明数据类型为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 的实例,这怎么可能?我只认为可以从类中创建对象,但我还阅读了有关枚举器中构造函数的内容。

两个小时以来,我一直在寻找有关此问题的答案,但没有成功。希望我现在还没有弄乱你的头。但我确实希望有人能对此有所了解并切实帮助我。

2 个答案:

答案 0 :(得分:1)

欢迎使用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();

答案 1 :(得分:1)

  

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

否。

  

或者是枚举器,只是类之类的关键字,而不是像我想象的那样是可变数据类型。

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

  

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

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

enum Test {EXAMPLE1, EXAMPLE2}

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

Test e = Test.EXAMPLE

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

Test.class是一个有意义的构造-它使您可以访问由enum声明定义的类实例。 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