枚举类能继承吗?能被继承吗?
枚舉的作用:限定“數據集”中的元素的個數(將類理解為一個集合)、即限定枚舉類對象的個數。
如果一個類的實例是有限且確定的,那么可以使用枚舉類。比如:季節類,只有春夏秋冬四個實例。
枚舉類與普通類的區別:
1.枚舉類也是類,也可以有自己的成員變量,成員方法,靜態方法、靜態變量等,也能實現其他的接口,不能繼承其他類了(因為已經繼承了java.lang.Enum)。枚舉類的對象默認都是public static final?
2.枚舉類與普通類的不同在于,它的構造器私有,這也決定了它如果需要被繼承時的特殊性。若果其它的外部類A繼承它,由于在構造類A的對象時,需要調用父類的構造方法,由于枚舉類的構造器私有,所有無法調用,導致枚舉類不可以被其它的外部類繼承。但是有沒有辦法去繼承它?答案是有的,那就需要用到內部類了(內部類能訪問外部類的任何成員,當然能訪問已被私有的構造器了)。
?
例子:簡單模擬下交通燈*********************************************
public?enum?TrafficLamp?{
//由于枚舉值默認式public,final,static,按照規范變量名全部大寫
//正是由于枚舉值的這一特性,為我們實現單列提供了一種很好的方案
//注意此時的枚舉值都是引用,相當于public?static?final?TrafficLamp?RED?=?new??//TrafficLamp();
RED{//匿名內部類,RED指向繼承了TrafficLamp的子類對象,以下同理
public?TrafficLamp?state(){
try?{
Thread.sleep(30000);
}?catch?(InterruptedException?e)?{
e.printStackTrace();
}
return?GREEN;
}
},GREEN{
public?TrafficLamp?state(){
try?{
Thread.sleep(60000);
}?catch?(InterruptedException?e)?{
e.printStackTrace();
}
return?YELLOW;
}
},YELLOW{
public?TrafficLamp?state(){
try?{
Thread.sleep(3000);
}?catch?(InterruptedException?e)?{
e.printStackTrace();
}
return?RED;
}
};
private?TrafficLamp(){}
private?TrafficLamp(int?time){
}
public?abstract?TrafficLamp?state();
//簡單的模擬
}
public?static?void?main(String[]?args)?{
Boolean?flag=true;
While(flag){
RED.state().state().state();
}
}
?
總結
以上是生活随笔為你收集整理的枚举类能继承吗?能被继承吗?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WSP框架:WEB组件的原理
- 下一篇: 接口与抽象类的比较