看完编译器如何处理枚举后,您提到常量是实例,这对我来说意义更大。但是,我还有一个问题。
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?该值如何添加到对象?我看不到任何构造函数将此值添加到对象中。
答案 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