Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对枚举中创建对象的方式感到困惑_Java_Class_Oop_Object_Enums - Fatal编程技术网

Java 对枚举中创建对象的方式感到困惑

Java 对枚举中创建对象的方式感到困惑,java,class,oop,object,enums,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 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呢?该值是如何添加到对象的?我看不到任何构造函数将此值添加到对象。

编译器将您的构造函数更改为:

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

这就是它起作用的原因

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

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

Add
private int number编码到您的第一个示例中。。。(还有第三个构造函数参数)。谢谢,这很有意义,所以构造函数是组合的。但这仍然有一部分没有得到回答,那就是:System.out.println(a)怎么可能输出EXAMPLE1?
javap -p -c -cp <directory> <package>.Test