Вопрос SCJP по теме Enums

Из книги SCJP Questions PDF я получил этот вопрос.

1. enum Animals {
2. DOG("woof"), CAT("meow"), FISH("burble");
3. String sound;
4. Animals(String s) { sound = s; }
5. }
6. class TestEnum {
7. static Animals a;
8. public static void main(String[] args) {
9. System.out.println(a.DOG.sound + " " + a.FISH.sound);
10. }
11. }

Варианты,

A. гав бормотание

B. Множественные ошибки компиляции

C. Сбой компиляции из-за ошибки в строке 2

D. Сбой компиляции из-за ошибки в строке 3

E. Сбой компиляции из-за ошибки в строке 4

F. Сбой компиляции из-за ошибки в строке 9

А правильный ответ,..

Может ли какой-нибудь орган объяснить это..

Могут ли перечисления иметь конструкторы?


person user617597    schedule 15.03.2011    source источник
comment
Это правильный ответ, потому что это то, что происходит, когда вы запускаете его.   -  person skaffman    schedule 15.03.2011


Ответы (5)


Да, перечисления могут иметь конструкторы, методы и переменные экземпляра, как и другие классы. Но вы не можете вызвать конструктор самостоятельно, как в случае с обычным классом. Вы не можете вызвать a= new Dog("woooooof"). Конструктор будет вызываться компилятором вместо вас.

Это будет нормально компилироваться, но в строке 9, я думаю, компилятор предупредит вас, что вы обращаетесь к статическому полю нестатическим способом. Animal.DOG.sound — это «правильный способ», а не звук .DOG.

person jumping-jack    schedule 15.03.2011

Enum — это класс. Он может иметь методы, конструкторы, поля... как и любой другой класс.

Обратите внимание: когда вы пишете DOG, CAT и т. д., вы указываете, какие именованные экземпляры этого перечисления вы хотите иметь. Если у них есть такие параметры, как звук здесь, вы должны предоставить соответствующий конструктор с параметрами.

person Jan Zyka    schedule 15.03.2011

Да, конструкторы перечислений разрешены, но вызывать их могут только константы перечисления. Вы не можете добавить больше экземпляров перечисления. В соответствии со стилем конструктор(ы) должен быть private. И, конечно же, поля экземпляра обычно должны быть private, а в перечислении final.

Также следует отметить, что вы можете получать статические поля и вызывать статические методы для выражений экземпляра (даже если они оцениваются как null).

person Tom Hawtin - tackline    schedule 15.03.2011
comment
(Что касается исходного вопроса, перечисление должно иметь имя Animal (или, по крайней мере, какое-то единственное число), поскольку каждый экземпляр представляет один тип животного, а не несколько животных.) - person Tom Hawtin - tackline; 15.03.2011

Перечисления могут иметь конструкторы. Перечисление фактически работает как суперкласс для всех параметров перечисления (CAT, DOG, FISH) в вашем примере.

Вы можете определить конструктор как для суперкласса (Animals), так и для отдельных опций перечисления (CAT, DOG, FISH). Конструктор(ы) опции enum может либо перегружать, либо переопределять конструктор(ы) суперкласса.

person Paul    schedule 15.03.2011

Просто чтобы вы знали, что я столкнулся с несколькими вопросами по перечислениям на экзамене SCJP, когда сдавал его на прошлой неделе. Я обычно не использую их и не пересматривал их, поэтому не думаю, что я хорошо справился с этими конкретными вопросами, хотя я все же сдал экзамен :)

Я знаю, что каждый экзамен выбирает ваши вопросы из случайного набора, но по какой-то причине вопросы по перечислениям кажутся фаворитами авторов экзамена...

person JohnHailey    schedule 26.04.2011