Java 枚举面试题

1. 什么是Java中的枚举?

枚举是一种特殊的类,它用于定义一个固定数量的常量,这些常量被称为枚举的实例。

2. 如何定义一个枚举?

使用enum关键字定义枚举,枚举的名字通常首字母大写,并遵循Pascal命名法。

public enum Day {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

3. 枚举实例是常量吗?

是的,枚举实例是常量,它们的值在初始化后不能被修改。

4. 枚举可以有自己的方法吗?

是的,枚举可以有自己的方法,这些方法可以是实例方法也可以是静态方法。

5. 枚举可以有构造函数吗?

是的,枚举可以有构造函数,但构造函数必须是私有的。

6. 枚举可以实现接口吗?

是的,枚举可以实现接口,并且可以提供接口方法的具体实现。

7. 枚举可以有属性吗?

是的,枚举可以有自己的属性,这些属性通常在构造函数中初始化。

8. 如何遍历一个枚举?

使用values()方法可以遍历枚举的所有实例。

for (Day day : Day.values()) {
    System.out.println(day);
}

9. 枚举可以有抽象方法吗?

是的,枚举可以有抽象方法,每个枚举实例必须提供该抽象方法的具体实现。

10. 枚举的`ordinal()`方法是什么?

ordinal()方法返回枚举实例的序数,即它在枚举声明中的位置(从0开始)。

11. 枚举可以实现`Comparable`接口吗?

可以,枚举可以实现Comparable接口,并重写compareTo()方法来定义枚举实例之间的比较规则。

12. 枚举可以实现`Serializable`接口吗?

是的,枚举自动实现了Serializable接口,因此枚举实例可以被序列化。

13. 枚举可以有构造函数参数吗?

是的,枚举可以有构造函数参数,这些参数用于初始化枚举实例的属性。

14. 枚举的构造函数可以访问哪些成员?

枚举的构造函数可以访问final实例变量和其他枚举实例。

15. 枚举可以有静态方法吗?

是的,枚举可以有静态方法,这些方法通常用于操作枚举实例或提供与枚举相关的工具功能。

16. 如何根据枚举的名称获取枚举实例?

可以使用valueOf()方法根据枚举的名称获取枚举实例。

Day day = Day.valueOf("MONDAY");

17. 枚举可以包含内部类吗?

是的,枚举可以包含内部类,包括静态内部类和非静态内部类。

18. 枚举实例可以被克隆吗?

不可以,枚举实例是单例的,并且是不可变的,因此它们不能被克隆。

19. 枚举可以与switch语句一起使用吗?

是的,枚举实例可以与switch语句一起使用,这使得基于枚举的代码更加清晰和易于维护。

20. 枚举可以有泛型吗?

不可以,枚举本身不能有泛型,但是枚举的方法可以返回泛型类型。

21. 枚举可以实现多个接口吗?

是的,枚举可以实现多个接口,并为接口方法提供具体实现。

22. 枚举的线程安全性如何?

枚举是线程安全的,因为它们的实例是不可变的,并且在类加载时初始化。

23. 枚举可以有注解吗?

是的,枚举可以有注解,这使得枚举实例可以携带额外的元数据。

24. 枚举可以被反射吗?

是的,枚举可以被反射,你可以使用Java的反射API来访问枚举的属性和方法。

25. 枚举可以有父类吗?

不可以,枚举隐式地继承了java.lang.Enum类,因此不能有其他的父类。