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