枚舉類默認是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修飾的。