enum不能被继承
1、枚舉類介紹
如果一個(gè)類的實(shí)例是有限且確定的,那么可以使用枚舉類。比如:季節(jié)類,只有春夏秋冬四個(gè)實(shí)例。
枚舉類使用enum進(jìn)行創(chuàng)建,其實(shí)例必須從”第一行“開始顯示寫出。
enum Season{SPRING,SUMMER,FALL,WINTER;//默認(rèn)public static final,這都是Season類的對(duì)象。}
特點(diǎn):
1、枚舉類的對(duì)象默認(rèn)都是public static final
2、枚舉類的構(gòu)造器都是private,所以無法在外部創(chuàng)建其實(shí)例,這也決定了枚舉類實(shí)例的個(gè)數(shù)的確定性(寫了幾個(gè)就是幾個(gè))。
3、enum類不可被繼承。
4、enum類默認(rèn)extends java.lang.Enum,所以無法再繼承其他類
2、遇到的問題
enum類默認(rèn)被final修飾的情況下,是無法有子類的。但是在《瘋狂Java講義》中是這么說的:
那么,問題來了:
enum Season{ // SPRING,SUMMER,FALL,WINTER;//默認(rèn)public static final,這都是Season類的對(duì)象。SPRING{public void show(){System.out.println("I'm Spring");}},SUMMER,FALL,WINTER;private String name;//構(gòu)造器默認(rèn)且只能是privateSeason(){System.out.println("Season run...");//運(yùn)行四次}public void setName(){//Java5開始,switch方法支持枚舉類對(duì)象。switch(this){case SPRING:name="春";break;case SUMMER:name="夏";break;case FALL:name="秋";break;case WINTER:name="冬";break;}}public void setName1(String name){this.name=name;}public String getName(){return name;}public void show(){System.out.println("I'm show");} }運(yùn)行結(jié)果:
?
問題:SPRING是Season匿名子類的對(duì)象,但是前面已經(jīng)說明Season類是final的?
3、真相
1、當(dāng)在enum類中創(chuàng)建匿名子類對(duì)象的時(shí)候,在運(yùn)行時(shí),會(huì)將Season編譯為一個(gè).class文件,沒有final修飾:
同時(shí)對(duì)于匿名子類,會(huì)生成一個(gè).class文件:
2、當(dāng)enum類中沒有匿名子類對(duì)象時(shí),對(duì)應(yīng)的class就是final的:
3、如果enum類中含有抽象方法,那么這個(gè)類就是抽象的:給出的對(duì)象必須實(shí)現(xiàn)抽象方法:
即便如此,還是無法繼承該類:
可以看出,即便enum中有抽象方法,它也是被final修飾的,由于final 和abstract是不能同時(shí)出現(xiàn)的。所以我認(rèn)為:枚舉類實(shí)際上不存在final、abstract。只是規(guī)定不能被繼承,final、abstract是對(duì)于運(yùn)行時(shí)生成的對(duì)應(yīng)class而言的。
結(jié)論:
1、enum類不存在final或者abstract的,就是不能被繼承。如果像《瘋狂Java講義》中說的,非抽象枚舉類默認(rèn)是final的,那么應(yīng)該可以顯示用final修飾,但是不行:
?
?所以說,enum本身不存在final、abstract的說法。就是不能被繼承。運(yùn)行時(shí)生成的class才有final、abstract的說法。
2、運(yùn)行時(shí),會(huì)生成對(duì)應(yīng)的.class文件(可以理解為一個(gè)新的class類型的類)。
2.1、如果enum類中沒有抽象方法,也沒有匿名子類對(duì)象,那么這個(gè)類是被final修飾的。
2.2、如果enum類中有抽象方法,那么這個(gè)類是抽象的,對(duì)象必須實(shí)現(xiàn)該抽象方法。
2.3、如果enum類中沒有抽象方法,但是有匿名子類對(duì)象,那么這個(gè)類不被final修飾,也不是抽象的。
轉(zhuǎn)載于:https://www.cnblogs.com/xiangguoguo/p/9061678.html
總結(jié)
- 上一篇: 梦到去世父母是啥预兆
- 下一篇: 拓展欧几里得理论基础(含一定证明)