版权声明:如需转载注明出处 https://blog.csdn.net/u011463794/article/details/88933674
枚举类默认是final修饰的,不能派生子类,但是
枚举类如果是抽象的,则其不是final修饰,可以派生子类,其子类为final修饰
枚举类包含匿名内部类,该父类不是final修饰,其内部类是final修饰
在今天的学习,我发现了枚举类enum是可以派生子类的,可是不是说enum为了不改变数据,使用final修饰的吗,于是我就自己试了试,首先使用正常没有派生子类的枚举类如下:
public enum AceEnum{
BOY("男孩"),GIRL("女孩");
private String gender;
private AceEnum(String gender){
this.gender = gender;
}
}
然后编译,并进行反编译:
可以看的出,在编译后,AceEnum枚举类已经是final类,那么按理说应该是不能派生子类的,可是,继续向下看。如果我们要为每个不同的枚举对象设置一个特定的方法,那么就需要应用的匿名内部类,为其实现相应方法,也就是改成下面的代码
public enum AceEnum{
BOY("男孩"){
public void show(){
System.out.println("我是男孩");
}
},GIRL("女孩"){
public void show(){
System.out.println("我是女孩");
};
};
private String gender;
private AceEnum(String gender){
this.gender = gender;
}
}
结果发现,他的final修饰符没有了,所以是可以派生出匿名子类,不过也同样注意到,匿名内部类中的方法是无意义的,因为没有办法通过枚举类使用该方法,所以需要为其添加一个可以呗访问的方法,
public enum AceEnum{
BOY("男孩"){
public void show(){
System.out.println("我是男孩");
}
},GIRL("女孩"){
public void show(){
System.out.println("我是女孩");
};
};
private String gender;
private AceEnum(String gender){
this.gender = gender;
}
public abstract void show();
}
也就发现,现在这种情况符合我们的要求,并且这个枚举类是抽象的,然后通过查阅资料,我发现
枚举类,如果是非抽象的,那么会默认采用final修饰,而如果是抽象的,也即是最后一个例子,那么由于抽象类是不能被final修饰的,(抽象类如果不实现就没什么意义,用final修饰的话会导致其不能被实现),所以是可以派生子类的。
而另一种情况,就是非抽象,不过用匿名内部类实现自己特定的方法:
public enum AceEnum{
MALE("男"){
public void info() {
System.out.println("男的");
}
},
FEMALE("女"){
public void info() {
System.out.println("女的");
}
};
private final String name;
private AceEnum(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void info() {
System.out.println("我是默认");
}
public static void main(String[] args) {
AceEnum boy = AceEnum.MALE;
boy.info();
}
}
编译后,有三个文件,一个是枚举类父类,他是没有final修饰符的,还有两个内部类,都继承于父类,他们都是final修饰的。