SCJP Вопрос по теме Enums - PullRequest
0 голосов
/ 15 марта 2011

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

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. Многочисленные ошибки компиляции

С. Компиляция не удалась из-за ошибки по линии 2

D. Компиляция не удалась из-за ошибки по линии 3

E. Компиляция не удалась из-за ошибки по линии 4

F. Компиляция не удалась из-за ошибки по линии 9

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

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

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

Ответы [ 5 ]

2 голосов
/ 15 марта 2011

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

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

2 голосов
/ 15 марта 2011

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

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

1 голос
/ 15 марта 2011

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

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

1 голос
/ 15 марта 2011

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

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

0 голосов
/ 26 апреля 2011

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

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

...