---------- android培訓、java培訓、期待與您交流! ----------
一、靜態導入
1、import和import static區別:
?。?)import 是導入一個類或某個包中所有的類。
?。?)import static是導入一個類中的某個靜態方法或所有的靜態方法。
注:在調用靜態導入的類的靜態方法時,可以不用再寫類名。如Arrays.sort(int[])可以直接寫sort(int[]);
2、靜態導入的寫法:
(1)import static java.util.Arrays.*; 表示導入Arrays類中的所有靜態成員。
?。?)import static java.lang.System.*; 表示導入System類中所有的靜態成員。
3、靜態導入注意事項:
?。?)當導入的兩個類中有同名成員時,需要在成員前加上相應的類名。
?。?)當類名重名時,需要指定具體的包名。
?。?)方法重名時,需要指定具體所屬的對象或者類。
二、可變參數
1、為什么引入可變參數?
如果一個方法在參數列表中傳入多個參數,個數不確定,那么每次都要重載該方法,代碼重復太多。雖然可以用數組作為形式參數,但是給形參傳遞數據時,每次都需要定義一個數組對象,作為實際參數,麻煩。于是在JDK1.5版本后,就提供了一個新特性:可變參數。
2、可變參數的書寫格式:
在形式參數的變量類型和變量名之間,加入三個點 … ,前后有無空格皆可。例如:
add(int… x){};
3、可變參數特點:
?。?)可變參數必須定義在參數列表的最后;
?。?)…位于“變量類型”和“變量名”之間;
?。?)可變參數其實就是數組參數的簡寫形式,編譯器為該可變參數隱式創建一個數組,在方法體中以數組的形式訪問可變參數。
三、增強型for循環
1、格式:
for(數據類型 變量名 : 被遍歷的集合(collection)或者數組) {執行語句}
2、說明
?。?)對集合進行遍歷。只能獲取集合元素。但是不能對集合進行操作??梢钥醋魇堑鞯暮唽懶问?。
(2)迭代器除了遍歷,還可以進行remove集合中元素的動作。如果使用ListIterator,還可以在遍歷過程中對集合進行增、刪、改、查的操作。
?。?)增強型for循環的變量類型前可加修飾符,如final(可被局部內部類訪問到)。
3、傳統for和高級for的區別:
?。?)傳統for循環可以完成對語句的多次操作,因為可以控制循環增量條件。在遍歷數組時有角標索引。
?。?) 高級for循環是一種簡化形式,它必須有遍歷目標,該目標要么是array或Collection單列集合,不可以直接遍歷Map集合,但可以將Map集合轉化為單列的Set集合,就可以使用。例如:
1 for( Map.Entry<Integer , String>) me : map.entrySet()){2 3 Integer key = me.getKey();4 5 String value = me.getValue();6 7 System.out.PRintln(key + “::” +value);8 9 }四、基本數據類型的自動拆箱與裝箱
1、自動裝箱:Integer iObj = 3;
2、自動拆箱:iObj + 2;
3、對于基本數據類型的說明:整數在-128 ~ 127之間的數,包裝成Integer類型對象,會存入常量池中的緩存,再創建一個對象的時候,如果其值在這個范圍內,就會直接到常量池中尋找,因為這些小數值使用的頻率很高,所以緩存到常量池中,被調用時就方便很多。
4、享元模式(flyweight):
描述:有很多個小的對象,它們有很多屬性相同,把屬性相同的部分變成一個對象,這些相同的屬性稱為這個對象的內部狀態(intrinsic)。把那些不同的屬性變成方法的參數,稱之為外部的狀態(extrinsic)。這種優化內存,只創建一個對象的模式,稱之為享元模式。
例如:Integer對象中對象的取值范圍在-128~127時,其值相同的對象相同,因為這些小的數被調用的頻率較高,所以被緩存在一個池中以備隨時調用。這樣就不用在創建新的對象,這就是典型的享元設計模式。
五、枚舉
?。ㄒ唬└攀?/strong>
1、枚舉:就是要讓某個類型的變量的取值只能為若干個固定值中的一個,否則,編譯器就會報錯。枚舉可以讓編譯器在編譯時就可以控制源程序中填寫的非法值,普通變量的方式在開發階段無法實現這一目標。它是java1.5中增加的一個新特性。
2、用普通類模擬枚舉的實現原理,代碼示例:
1 /* 普通類定義一個Weekday的類來模擬枚舉功能。 2 3 1、私有的構造方法 4 5 2、每個元素分別用一個公有的靜態成員變量表示 6 7 3、可以有若干公有方法或抽象方法。采用抽象方法定義nextDay就將大量的if.else語句轉移成了一個個獨立的類。 8 9 */10 11 public abstract class WeekDay {12 13 //構造函數被私有化,禁止別人創建對象14 15 private WeekDay(){}16 17 //將每一個元素,定義為靜態常量18 19 public final static WeekDay SUN=new WeekDay(){20 21 public WeekDay nextDay(){22 23 return MON;24 25 }26 27 };28 29 public final static WeekDay MON=new WeekDay(){30 31 public WeekDay nextDay(){32 33 return SUN;34 35 }36 37 };38 39 public abstract WeekDay nextDay();40 41 public String toString(){42 43 return this==SUN?"SUM":"MON";44 45 }46 47 }?。ǘ┟杜e的基本應用
1、概述
(1)通過enum關鍵字定義枚舉類,枚舉類是一個特殊的類,每個元素都是該類的一個實例對象。
?。?)用枚舉類規定值,如上面的WeekDay類。以后用此類型定義的值只能是這個類中規定好的值,若不是這些值,編譯器不會通過。
?。?)在編譯時期就會發現錯誤,減少了運行時期的錯誤。
?。?)如果調用者想打印枚舉類中元素的信息,需由編寫此類的人定義toString方法。
注:枚舉類是一個class,而且是一個不可被繼承的final類,其中的元素都是類靜態常量。
2、枚舉常用方法
(1)構造方法
① 構造方法,只在構造枚舉值的時候被調用。
② 構造方法只有private的,沒有public的。這樣禁止枚舉實例對象被外部定義。枚舉值是public static final的常量,枚舉類的方法和數據域是可以被外部訪問的。
?、?構造函數可以有多個,調用哪個即初始化相應的值。
?。?)靜態方法
① valueOf(String e):轉為對應的枚舉對象,即將字符串轉為對象
?、?values() :獲取所有的枚舉對象元素
?。?)非靜態方法
① String toString():返回枚舉量的名稱
② int ordinal():返回枚舉值在枚舉類中的順序,按定義的順序排
③ Class getClass():獲取對應的類名
?、?String name():返回此枚舉常量的名稱,在其枚舉聲明中對其進行聲明。
3、示例代碼:
1 public class EnumDemo { 2 3 public static void main(String[] args) { 4 5 WeekDay weekday = WeekDay.MON; 6 7 System.out.println(“1”+weekDay);//輸出枚舉常量名 8 9 System.out.println(“2”+weekDay.name());//輸出對象名10 11 System.out.println(“3”+weekDay.getClass());//輸出對應類12 13 System.out.println(“4”+weekDay.toString());//輸出枚舉對象名14 15 System.out.println(“5”+weekDay.ordinal());//輸出此對象在枚舉常量的次序16 17 System.out.println(“6”+WeekDay.valueOf("WED"));//將字符串轉化為枚舉常量18 19 System.out.println(“7”+WeekDay.values().length);//獲取所以的枚舉元素,并打印其長度20 21 }22 23 //定義枚舉內部類24 25 public enum WeekDay{26 27 SUN(1),MON,TUE,WED,THI,FRI,SAT;//分號可有可無,但如果下面還有方法或其他成員時,分號不能省。并且當有其他方法時,必須在這些枚舉變量的下方。28 29 30 31 //無參構造器32 33 private WeekDay(){34 35 System.out.println("First");36 37 }38 39 //帶參數的構造器40 41 private WeekDay(int day){42 43 System.out.println("Second");44 45 }46 47 }48 49 }(三)枚舉的高級應用
1、枚舉:就相當于一個類,其中也可以定義構造方法、成員變量、普通方法和抽象方法。
2、枚舉元素:必須位于枚舉體中的最開始部分,枚舉元素列表的后要有分號與其他成員分隔。把枚舉中的成員方法或變量等放在枚舉元素的前面,編譯器報告錯誤。
3、帶構造方法的枚舉
?。?)構造方法必須定義成“私有“。
(2)如果有多個構造方法,該如何選擇?
?。?)枚舉元素MON和MON()的效果一樣,都是調用默認的構造方法。
4、帶方法的枚舉
(1)定義枚舉TrafficLamp
?。?)實現普通的next方法
(3)實現抽象的next方法:每個元素分別是由枚舉類的子類來生成的實例對象,這些子類采用類似內部類的方式進行定義。
(4)增加表示時間的構造方法
* 代碼示例:
1 public class EnumTest { 2 3 public enum TrafficLamp{ 4 5 RED(30){ 6 7 public TrafficLamp nextLamp(){ 8 9 return GREEN;10 11 }12 13 },14 15 GREEN(30){16 17 public TrafficLamp nextLamp(){18 19 return YELLOW;20 21 }22 23 },24 25 YELLOW(5){26 27 public TrafficLamp nextLamp(){28 29 return RED;30 31 }32 33 };34 35 private int time;36 37 //構造器38 39 private TrafficLamp(int time){40 41 this.time=time;}42 43 //抽象方法44 45 public abstract TrafficLamp nextLamp();46 47 }48 49 }---------- android培訓、java培訓、期待與您交流! ----------
新聞熱點
疑難解答