教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

jdk1.5的新特性(下)

更新時(shí)間:2018年10月24日16時(shí)09分 來源:傳智播客 瀏覽次數(shù):

  (5)枚舉

  **為什么要有枚舉?

  問題:要定義星期幾或性別的變量,該怎么定義?假設(shè)用1-7分別表示星期一到星期日,

  但有人可能會寫成int weekday = 0;或即使使用常量方式也無法阻止意外。

  枚舉就是要讓某個(gè)類型的變量的取值只能為若干個(gè)固定值中的一個(gè),否則,編譯器就會報(bào)錯(cuò)。

  枚舉可以讓編譯器在編譯時(shí)就可以控制源程序中填寫的非法值,

  普通變量的方式在開發(fā)階段無法實(shí)現(xiàn)這一目標(biāo)。

  **用普通類如何實(shí)現(xiàn)枚舉的功能?定義一個(gè)Weekday類來模擬實(shí)現(xiàn):

  步驟:

  *私有化構(gòu)造方法

  *每個(gè)元素分別用一個(gè)公有的靜態(tài)成員變量表示(publicstatic final)

  *可以有若干公有方法或抽象方法。采用抽象方法定義nextDay就將大量的if.else語句

  轉(zhuǎn)移成了一個(gè)個(gè)獨(dú)立的類。

  **枚舉的應(yīng)用:

  舉例:定義一個(gè)Weekday的枚舉。

  擴(kuò)展:枚舉類的values,valueOf,name,toString,ordinal等方法

  (記住,講課時(shí)要先于自定義方法前介紹,講課更流暢)

  總結(jié):枚舉是一種特殊的類,其中的每個(gè)元素都是該類的一個(gè)實(shí)例對象。

  例如可以調(diào)用WeekDay.SUN.getClass().getName和WeekDay.class.getName()。

  **枚舉的高級應(yīng)用:

  **枚舉就相當(dāng)于一個(gè)類,其中也可以定義構(gòu)造方法、成員變量、普通方法和抽象方法。

  **枚舉元素必須位于枚舉體中的最開始部分,枚舉元素列表的后要有分號與其他成員分隔。

  把枚舉中的成員方法或變量等放在枚舉元素的前面,編譯器報(bào)告錯(cuò)誤。

  **帶構(gòu)造方法的枚舉

  構(gòu)造方法必須定義成私有的

  如果有多個(gè)構(gòu)造方法,該如何選擇哪個(gè)構(gòu)造方法?

  枚舉元素MON和MON()的效果一樣,都是調(diào)用默認(rèn)的構(gòu)造方法。

  **帶方法的枚舉

  定義枚舉TrafficLamp

  實(shí)現(xiàn)普通的next方法

  實(shí)現(xiàn)抽象的next方法:每個(gè)元素分別是由枚舉類的子類來生成的實(shí)例對象,

  這些子類采用類似內(nèi)部類的方式進(jìn)行定義。增加上表示時(shí)間的構(gòu)造方法

  **枚舉只有一個(gè)成員時(shí),就可以作為一種單例的實(shí)現(xiàn)方式。

  (6)泛型:

  **泛型是提供給javac編譯器使用的,可以限定集合中的輸入類型,讓編譯器擋住源程序中的非法輸入,

  編譯器編譯帶類型說明的集合時(shí)會去除掉“類型”信息,使程序運(yùn)行效率不受影響,

  對于參數(shù)化的泛型類型,getClass()方法的返回值和原始類型完全一樣。

  由于編譯生成的字節(jié)碼會去掉泛型的類型信息,只要能跳過編譯器,

  就可以往某個(gè)泛型集合中加入其它類型的數(shù)據(jù),例如,用反射得到集合,再調(diào)用其add方法即可。

  **ArrayList類定義和ArrayList類引用中涉及如下術(shù)語:

  整個(gè)稱為ArrayList泛型類型

  ArrayList中的E稱為類型變量或類型參數(shù)

  整個(gè)ArrayList稱為參數(shù)化的類型

  ArrayList中的Integer稱為類型參數(shù)的實(shí)例或?qū)嶋H類型參數(shù)

  ArrayList中的<>念著typeof

  ArrayList稱為原始類型

  **參數(shù)化類型與原始類型的兼容性:

  參數(shù)化類型可以引用一個(gè)原始類型的對象,編譯報(bào)告警告,

  例如,

  Collection c = new Vector();//可不可以,不就是編譯器一句話的事嗎?

  原始類型可以引用一個(gè)參數(shù)化類型的對象,編譯報(bào)告警告,

  例如,

  Collection c = new Vector();//原來的方法接受一個(gè)集合參數(shù),新的類型也要能傳進(jìn)去

  **參數(shù)化類型不考慮類型參數(shù)的繼承關(guān)系:

  Vector v = new Vector (); //錯(cuò)誤!///不寫沒錯(cuò),寫了就是明知故犯

  Vector v = new Vector(); //也錯(cuò)誤!

  編譯器不允許創(chuàng)建泛型變量的數(shù)組。即在創(chuàng)建數(shù)組實(shí)例時(shí),

  數(shù)組的元素不能使用參數(shù)化的類型,

  例如,下面語句有錯(cuò)誤:

  Vector vectorList[] = new Vector[10];

  **泛型限定:

  **限定通配符的上邊界:

  正確:Vectorx =new Vector();

  錯(cuò)誤:Vectorx =new Vector();

  **限定通配符的下邊界:

  正確:Vectorx =new Vector();

  錯(cuò)誤:Vectorx =new Vector();

  **提示:

  限定通配符總是包括自己。

  ?只能用作引用,不能用它去給其他變量賦值

  Vectory = new Vector();

  Vector x = y;

  上面的代碼錯(cuò)誤,原理與Vector x11 = newVector();相似,

  只能通過強(qiáng)制類型轉(zhuǎn)換方式來賦值。



作者:傳智播客JavaEE培訓(xùn)學(xué)院
首發(fā):http://java.itcast.cn/

0 分享到:
和我們在線交談!