更新時間:2018年10月24日16時09分 來源:傳智播客 瀏覽次數(shù):
(5)枚舉
**為什么要有枚舉?
問題:要定義星期幾或性別的變量,該怎么定義?假設(shè)用1-7分別表示星期一到星期日,
但有人可能會寫成int weekday = 0;或即使使用常量方式也無法阻止意外。
枚舉就是要讓某個類型的變量的取值只能為若干個固定值中的一個,否則,編譯器就會報錯。
枚舉可以讓編譯器在編譯時就可以控制源程序中填寫的非法值,
普通變量的方式在開發(fā)階段無法實現(xiàn)這一目標(biāo)。
**用普通類如何實現(xiàn)枚舉的功能?定義一個Weekday類來模擬實現(xiàn):
步驟:
*私有化構(gòu)造方法
*每個元素分別用一個公有的靜態(tài)成員變量表示(publicstatic final)
*可以有若干公有方法或抽象方法。采用抽象方法定義nextDay就將大量的if.else語句
轉(zhuǎn)移成了一個個獨立的類。
**枚舉的應(yīng)用:
舉例:定義一個Weekday的枚舉。
擴展:枚舉類的values,valueOf,name,toString,ordinal等方法
(記住,講課時要先于自定義方法前介紹,講課更流暢)
總結(jié):枚舉是一種特殊的類,其中的每個元素都是該類的一個實例對象。
例如可以調(diào)用WeekDay.SUN.getClass().getName和WeekDay.class.getName()。
**枚舉的高級應(yīng)用:
**枚舉就相當(dāng)于一個類,其中也可以定義構(gòu)造方法、成員變量、普通方法和抽象方法。
**枚舉元素必須位于枚舉體中的最開始部分,枚舉元素列表的后要有分號與其他成員分隔。
把枚舉中的成員方法或變量等放在枚舉元素的前面,編譯器報告錯誤。
**帶構(gòu)造方法的枚舉
構(gòu)造方法必須定義成私有的
如果有多個構(gòu)造方法,該如何選擇哪個構(gòu)造方法?
枚舉元素MON和MON()的效果一樣,都是調(diào)用默認(rèn)的構(gòu)造方法。
**帶方法的枚舉
定義枚舉TrafficLamp
實現(xiàn)普通的next方法
實現(xiàn)抽象的next方法:每個元素分別是由枚舉類的子類來生成的實例對象,
這些子類采用類似內(nèi)部類的方式進行定義。增加上表示時間的構(gòu)造方法
**枚舉只有一個成員時,就可以作為一種單例的實現(xiàn)方式。
(6)泛型:
**泛型是提供給javac編譯器使用的,可以限定集合中的輸入類型,讓編譯器擋住源程序中的非法輸入,
編譯器編譯帶類型說明的集合時會去除掉“類型”信息,使程序運行效率不受影響,
對于參數(shù)化的泛型類型,getClass()方法的返回值和原始類型完全一樣。
由于編譯生成的字節(jié)碼會去掉泛型的類型信息,只要能跳過編譯器,
就可以往某個泛型集合中加入其它類型的數(shù)據(jù),例如,用反射得到集合,再調(diào)用其add方法即可。
**ArrayList
整個稱為ArrayList
ArrayList
整個ArrayList
ArrayList
ArrayList
ArrayList稱為原始類型
**參數(shù)化類型與原始類型的兼容性:
參數(shù)化類型可以引用一個原始類型的對象,編譯報告警告,
例如,
Collection
原始類型可以引用一個參數(shù)化類型的對象,編譯報告警告,
例如,
Collection c = new Vector
**參數(shù)化類型不考慮類型參數(shù)的繼承關(guān)系:
Vector
Vector v = new Vector
編譯器不允許創(chuàng)建泛型變量的數(shù)組。即在創(chuàng)建數(shù)組實例時,
數(shù)組的元素不能使用參數(shù)化的類型,
例如,下面語句有錯誤:
Vector
**泛型限定:
**限定通配符的上邊界:
正確:Vectorx =new Vector
錯誤:Vectorx =new Vector
**限定通配符的下邊界:
正確:Vectorx =new Vector
錯誤:Vectorx =new Vector
**提示:
限定通配符總是包括自己。
?只能用作引用,不能用它去給其他變量賦值
Vectory = new Vector
Vector
上面的代碼錯誤,原理與Vector x11 = newVector
只能通過強制類型轉(zhuǎn)換方式來賦值。