Прежде всего, ваш код не компилируется.Вы не можете определить info()
дважды в одном и том же перечислении.
Эта строка должна быть удалена: public void info() { System.out.println("Ordinary universal colour"); }
В любом случае, когда вы ожидаете, что это сработает?Он не связан ни с одним цветом.
Правильное определение будет выглядеть следующим образом:
enum Color {
GREEN {
@Override
public void info() {
System.out.println("Dangerous Color: GREEN");
}
},
RED {
@Override
public void info() {
System.out.println("Dangerous Color");
}
},
BLUE {
@Override
public void info() {
System.out.println("Ordinary universal colour: BLUE");
}
};
public abstract void info();
}
Причина, по которой вам нужно определить abstract void info()
на уровне перечисления, заключается в том, что вы хотите применитьчто все константы в вашем перечислении обеспечивают это.Это гарантирует, что все экземпляры перечисления предоставят его, поэтому строка c1.info()
в вашей функции main()
работает.
Если вы попытаетесь удалить abstract void info()
, ваши константы будут по совпадению каждый имеет info()
реализованный, но ничего не говорит компилятору, что на уровне enum Color
он всегда будет у вас.Таким образом, он не будет компилироваться.
Если вы хотите получить чуть менее громоздкое определение, вы можете изменить его следующим образом, что делает то же самое:
enum Color {
GREEN("Dangerous Color: GREEN"),
RED("Dangerous Color"),
BLUE("Ordinary universal colour: BLUE");
private final String info;
Colour(String info) {
this.info = info;
}
public void info() {
System.out.println(info);
}
}