Посмотрев, как компилятор обрабатывает перечисления, и вы упомянули, что константы являются экземплярами, все это стало для меня гораздо более понятным. Однако у меня остался еще один вопрос.
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 );
}
И во-вторых, даже если определенный мной конструктор каким-то образом вызывается, как это приводит к выводу EXAMPLE1, когда я говорю System.out.println (a)? Ни конструктор, который я определил, ни конструктор, добавленный компилятором, не добавляют значение значения EXAMPLE1 в любое поле объекта, хранящегося в константе EXAMPLE1. Так как это возможно, что System.out.println (a) выводит EXAMPLE1? Как это значение даже добавляется к объекту? Я не вижу ни одного конструктора, добавляющего это значение к объекту.