枚举对象的方式感到困惑

时间:2018-09-09 01:15:30

标签: java class oop object enums

看完编译器如何处理枚举后,您提到常量是实例,这对我来说意义更大。但是,我还有一个问题。

public enum Weekday
{
  MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
} 

编译器将其编译如下;

class Weekday extends Enum
{
  public static final Weekday MONDAY  = new Weekday( "MONDAY",   0 );
  public static final Weekday TUESDAY = new Weekday( "TUESDAY ", 1 );
  public static final Weekday WEDNESDAY= new Weekday( "WEDNESDAY", 2 );
  public static final Weekday THURSDAY= new Weekday( "THURSDAY", 3 );
  public static final Weekday FRIDAY= new Weekday( "FRIDAY", 4 );
  public static final Weekday SATURDAY= new Weekday( "SATURDAY", 5 );
  public static final Weekday SUNDAY= new Weekday( "SUNDAY", 6 );

  private Weekday( String s, int i )
  {
    super( s, i );
  }

  //

在下面的示例中,我想解释我的最后一个问题:我已经看到了如下代码片段:

enum Test 
{
  EXAMPLE1(5), EXAMPLE2(6);

  private int number;

  Test(int number) {
    this.number = number;
  }

}

Test a = Test.EXAMPLE1;
System.out.println(a) outputs EXAMPLE1
System.out.println(a.number) outputs 5;

现在,当创建存储在常量EXAMPLE1中的对象时,我会与上面的输出混淆:

public static final Test EXAMPLE1  = new Test( "EXAMPLE1",   0 );

首先,编译器添加了构造函数,如果该构造函数存在,那么我定义的构造函数怎么被调用?

private Test( String s, int i )
  {
    super( s, i );
  }

第二,即使我定义的构造函数以某种方式被调用,当我说System.out.println(a)时,如何导致输出Example1?无论是我定义的构造函数,还是添加的构造函数编译器,都不会将值EXAMPLE1添加到常量EXAMPLE1中存储的对象的任何字段中。那么System.out.println(a)如何输出Example1?该值如何添加到对象?我看不到任何构造函数将此值添加到对象中。

1 个答案:

答案 0 :(得分:0)

编译器将您的构造函数从以下位置更改:

Test(int number) {
    this.number = number;
}

private Test(String name, int ordinal, int number) {
    super(name, ordinal);
    this.number = number;
}

这就是它起作用的原因。

如果要使用javap工具,可以对此进行验证:

javap -p -c -cp <directory> <package>.Test