常见面试题
- 枚举允许继承类吗
- 枚举允许实现接口吗
- 枚举可以用等号比较吗
- 其他的类可以继承枚举吗
- 枚举可以实现单例模式吗
- 当使用CompareTo()比较枚举时,比较的是什么
- 当使用equals()比较枚举的时候,比较的是什么
答案 - 枚举不能继承任何类,因为系统默认继承Enum,加上单继承模式,就不能继承任何类。
- 枚举允许实现接口,因为枚举本身就是一个类,类可以实现多个接口
- 枚举可以使用等号比较。每个枚举里面的实例都是一个类对象(静态常量,用类名.调用) 。类对象是单例。
- 枚举是final修饰的类,无法被继承。
- 枚举是实现单例模式的例子,它是实现单例模式的一种很好方式。
- 当使用CompareTo()比较枚举时,比较的是比较的是枚举类对象的ordinal的值。
- 当使用equals()比较枚举的时候,比较的是内存地址,和等号作用相同。
JDK1.5新特性
这个是jdk1.5新特性,这个还是很有用的。
定义
常见的使用场景:性别;星期;季节。这些固定取值空间的。
public enum 枚举名{
枚举体(常量列表),常量之间用逗号隔开,最后的分号可以有,亦可以没有
}
//下面写个性别的枚举。
public enum Gender {
male,female;
}
枚举的本质
以上面的Gender枚举来讲。
- 定义一个继承Enum的类Gender,Gender类是用final修饰的。
- 为每个枚举实例对应创建一个类对象。这些类对象使用public static final 修饰的,同时生成一个数组,用于保存所有的类对象。
- 生成一个静态代码块,用于初始化类对象和类对象数组
- 生成一个构造方法,构造方法有参,参数的含义是
- 生成一个静态的values()方法,返回所有的类对象。
- 生成一个静态的valuesOf()方法,根据参数返回对应的类实例
枚举和字符串之间的相互转化
public enum Gender {
male,female;
}
public class Person {
private String name;
private int age ;
private Gender gender;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Gender getGender() {
return gender;
}
public void setGender(Gender gender) {
this.gender = gender;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", gender=" + gender + "]";
}
public Person(String name, int age, Gender gender) {
super();
this.name = name;
this.age = age;
this.gender = gender;
}
public Person() {
super();
}
}
public class Demo {
public static void main(String[] args) {
Person person = new Person("张三" , 18 , Gender.female);
person.toString();
Gender gender = Gender.female;
//枚举与String类型的转化
String str = gender.toString();
System.out.println(str);
//String 转化为枚举
Gender gender1 = Enum.valueOf(Gender.class, "female");
System.out.println(gender1);
//遍历枚举类
for( Gender gender2: Gender.values()) {
System.out.println(gender2);
}
//
}
}