0

从 SCJP Questions PDF book 中,我得到了这个问题..

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. woof burble

B. 多个编译错误

C. 由于第 2 行的错误,编译失败

D. 由于第 3 行出错,编译失败

E. 由于第 4 行的错误,编译失败

F. 第9行出错导致编译失败

A是正确答案,...

有人可以解释一下吗..

枚举是否可以有构造函数?

4

5 回答 5

2

枚举是一个类。它可以像任何其他类一样具有方法、构造函数、字段……。

请注意,当您编写 DOG、CAT 等时,您正在命名您想要拥有的该枚举的哪些命名实例。如果他们有像这里的声音这样的参数,你必须为适当的构造函数提供参数。

于 2011-03-15T14:10:49.803 回答
2

是的,枚举是允许的构造函数,但只有枚举常量可以调用它。您不能添加更多的枚举实例。作为风格问题,构造函数应该是private. 当然,实例字段通常应该是private, 和 enum final

另请注意,您可以获得静态字段并在实例表达式上调用静态方法(即使它们评估为null)。

于 2011-03-15T14:12:25.430 回答
1

枚举可以有构造函数。在您的示例中,枚举实际上就像所有枚举选项(CAT、DOG、FISH)的超类一样工作。

您可以为超类(Animals)和单个枚举选项(CAT、DOG、FISH)定义一个构造函数。枚举选项构造函数可以重载或覆盖超类构造函数。

于 2011-03-15T14:14:23.040 回答
1

是的,枚举可以像其他类一样具有构造函数、方法和实例变量。但是您不能像使用普通类一样自己调用构造函数。您不能调用 a= new Dog("wooooof")。编译器将为您调用构造函数。

这可以很好地编译,但是在第 9 行,我认为编译器会警告您正在以非静态方式访问静态字段。Animal.DOG.sound 是“正确的方式”,而不是 a.DOG.sound。

于 2011-03-15T14:18:09.213 回答
0

只是为了让你知道,当我上周参加 SCJP 考试时,我遇到了很多关于枚举的问题。我通常不使用它们,也没有真正修改它们,所以不要认为我在这些特定问题上做得很好——尽管我仍然通过了考试:)

我知道每次考试都会从随机集合中挑选你的问题,但出于某种原因,关于枚举的问题似乎是考试作者的最爱......

于 2011-04-26T12:42:48.160 回答