黑馬程序員--java高新技術--java5的枚舉

---------------------- android培訓java培訓、期待與您交流! ----------------------

=================4單元:java5的枚舉==================

12.枚舉的作用介紹

13.用普通類模擬枚舉的實現原理

14.java5的枚舉的基本應用

15.實現帶有構造方法的枚舉

16.實現帶有抽象方法的枚舉

******************************************************************************************************************************

=================4單元:java5的枚舉==================

10.枚舉的作用介紹

爲什麼要有枚舉

問題:要定義星期幾或性別的變量,該怎麼定義?假設用1-7分別表示星期一到星期日,但有人可能會寫成int weekday = 0;或即使使用常量方式也無法阻止意外。

枚舉就是要讓某個類型的變量的取值只能爲若干個固定值中的一個,否則,編譯器就會報錯。枚舉可以讓編譯器在編譯時就可以控制源程序中填寫的非法值,普通變量的方式在開發階段無法實現這一目標。

11.用普通類模擬枚舉的實現原理

用普通類如何實現枚舉功能,定義一個Weekday的類來模擬枚舉功能。 

私有的構造方法

每個元素分別用一個公有的靜態成員變量表示

可以有若干公有方法或抽象方法。採用抽象方法定義nextDay就將大量的if.else語句轉移成了一個個獨立的類。

12.java5的枚舉的基本應用

枚舉的基本應用

舉例:定義一個Weekday的枚舉。

擴展:枚舉類的values,valueOf,name,toString,ordinal等方法(記住,講課時要先於自定義方法前介紹,講課更流暢)

總結:枚舉是一種特殊的類,其中的每個元素都是該類的一個實例對象,例如可以調用WeekDay.SUN.getClass().getNameWeekDay.class.getName()

13.實現帶有構造方法的枚舉

枚舉就相當於一個類,其中也可以定義構造方法、成員變量、普通方法和抽象方法。

枚舉元素必須位於枚舉體中的最開始部分,枚舉元素列表的後要有分號與其他成員分隔。把枚舉中的成員方法或變量等放在枚舉元素的前面,編譯器報告錯誤。

帶構造方法的枚舉

構造方法必須定義成私有的

如果有多個構造方法,該如何選擇哪個構造方法?

枚舉元素MONMON()的效果一樣,都是調用默認的構造方法。

帶方法的枚舉

定義枚舉TrafficLamp

實現普通的next方法

實現抽象的next方法:每個元素分別是由枚舉類的子類來生成的實例對象,這些子類採用類似內部類的方式進行定義。

增加上表示時間的構造方法

枚舉只有一個成員時,就可以作爲一種單例的實現方式。

16.實現帶有抽象方法的枚舉

寫帶有抽象方法的枚舉步驟和技巧:

        1. enum TrafficLamp{RED,GREEN,YELLOW}

        2. enum TrafficLamp{RED,GREEN,YELLOW;public abstract next();}

        3.enum TrafficLamp{RED{},GREEN{},YELLOW{};public abstract next();}

        4.填充各個{}中的next方法。

package cn.itcast.day1;
public abstract class WeekDay1 {
private WeekDay1(){}
public final static WeekDay1 SUN = new WeekDay1(){
@Override
public WeekDay1 nextDay() {
// TODO Auto-generated method stub
return MON;
}};//這是一個內部類,是WeekDay的子類,並且創建了一個對象,要覆蓋父類方法.
public final static WeekDay1 MON = new WeekDay1(){
@Override
public WeekDay1 nextDay() {
// TODO Auto-generated method stub
return SUN;
}};
public abstract WeekDay1 nextDay();
/*public WeekDay nextDay()
{
if(this == SUN)
{
return MON;
}
else {
return SUN;
}
}*/ 
public String toString(){
return this==SUN?"SUN":"MON";
}
}
package cn.itcast.day1;
import java.util.Date;
public class EnumTest {
/**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
WeekDay1 weekDay = WeekDay1.MON;//MON是一個對象賦給了這個類型的引用weekDay.
System.out.println(weekDay.nextDay());
WeekDay weekDay2 = WeekDay.FRI;
System.out.println(weekDay2);//枚舉自動調用toStrong方法.
System.out.println(weekDay2.name());
System.out.println(weekDay2.ordinal());//排名
System.out.println(WeekDay.valueOf("SUN"));//把字符串變成對象.
System.out.println(WeekDay.values().length);//得到枚舉元素數組.
new Date(300){};
}
//內部類
public enum WeekDay 
{
SUN(1),MON(),TUE,WED,THI,FRI,SAT;//元素列表必須在所有成員之前.
//想用帶參數的構造方法就像SUN(1)這樣.
private WeekDay(){System.out.println("first");};//必須是私有的,只要用到了類,靜態方法會先初始化.
private WeekDay(int day){System.out.println("second");}
}
//內部類
public enum TrafficLamp
{
//因爲是抽象方法,子類必須重寫.
RED (30){
@Override
public TrafficLamp nextLamp() {
// TODO Auto-generated method stub
return GREEN;
}
},
GREEN (45){
@Override
public TrafficLamp nextLamp() {
// TODO Auto-generated method stub
return YELLOW;
}
},
YELLOW (5){
@Override
public TrafficLamp nextLamp() {
// TODO Auto-generated method stub
return RED;
}
};
public abstract TrafficLamp nextLamp();
private int time;
private TrafficLamp(int time)
{
this.time = time;
}
}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章