一、靜態導入
1、靜態導入的與普通import的區別:
import語句可以導入一個類,或者包中的類;
import static 語句可以導入一個類的中的某個靜態成員,也可以導入所有的靜態成員。
2、優劣分析:
優點:可以少寫類名,使某些代碼變簡潔
缺點:成員歸屬不明確,使可讀性不強,易產生混淆
3、用法示例:
package cn.itheima.blog1; //import static java.lang.Math.*;//導入所有成員 import static java.lang.Math.PI;//靜態導入成員變量 import static java.lang.Math.max;//靜態導入成員函數 public class StaticImportDemo { /** * 靜態導入示例(Math類) * 1、導入所有成員 * 2、導入某個成員函數 * 3、導入某個成員變量 */ public static void main(String[] args) { System.out.println("PI的值是" + PI); System.out.println("1,2之間較大的數爲:" + max(1,2)); } }
二、可變參數
1、用法格式:void sum(int ... arr){}
2、特點:
第一:只能出現在參數列表的最後;
第二:...位於變量類型和變量名之間,前後有無空格都可以;
第三:調用可變參數的方法時,編譯器爲該可變參數隱含創建一個數組, 在方法體中一數組的形式訪問可變參數
3、適用情況:適用於參數類型固定,但是參數數量不固定的情況
4、用法示例:
package cn.itheima.blog1; public class VariableParameters { /** * 可變參數示例 */ public static void main(String[] args) { //輸入不同參數 System.out.println(sum(1, 2)); System.out.println(sum(2, 3, 2, 2)); } //可變參數只能在最後 public static int sum(int x, int...arg) { int sum = x; //參數用數組維護,對其進行遍歷 for(int i = 0; i < arg.length; i++){ sum = sum + arg[i]; } return sum; } }
三、增強for循環
1、用法格式:for(T type : 需要被遍歷的集合(實現Iterator)或者數組)
2、與傳統for循環的比較:
第一:傳統for循環能完全替代普通for循環
第二:增強for適用於僅需遍歷的情況,比較方便;而傳統for則還適用在操作數組角標,不需要遍歷數組等情況下。
3、用法示例:
package cn.itheima.blog1; public class ForStrong { /** * 增強for循環 */ public static void main(String[] args) { int[] arr = new int[3]; //對數組中的每個元素賦值,不僅要遍歷還要操作角標,用普通for for(int i = 0; i < arr.length; i++){ arr[i] = i + 1; } //遍歷數組,打印,不需要對數據進行操作 for(int i : arr){ System.out.print(i + " "); } } }
三、自動拆箱裝箱與享元模式
1、拆箱與裝箱:
拆箱:把基本數據類型的包裝類型轉換成基本數據類型,當包裝類與基本數據類型運算就需要自動拆箱
裝箱:把基本數據類型轉換成包裝類型,當基本數據類型賦值給包裝類,就會自動裝箱
2、細節:
byte,short,int,char,long在-128-127之間的數,裝箱成各自的包裝類時,均會對象重用,boolean類型一直會對象重用,而double,float就不會,這就是享元模式的一種體現。
3、用法示例:
package cn.itheima.blog1; public class AutoBoxing { /** * 自動拆裝箱 */ public static void main(String[] args) { //自動裝箱,將基本數據類型封裝成對應包裝類 Integer b1 = 2; Integer b2 = 2; //2在-128到127之間,隨便是兩個對象,但是指向的是同一處 System.out.println(b1 == b2); /* * 實現細節:c1是包裝類,c2是int,所以第三步運算過程是 * c1自動拆箱成int,與c2相加後,又自動裝箱爲Integer */ Integer c1 = 3; int c2 = 5; c1 = c1 + c2; System.out.println(c1.getClass()); } }
4、享元模式(Flyweight Pattern)
享元模式:若有很多的小對象,均有相同的屬性,那就將其作爲一個對象,相同的屬性作爲對象的內部屬性;而不同的屬性,作爲函數的參數傳入,作爲外部屬性。
適用範圍:當大量物件只是重複因而導致無法令人接受的使用大量內存
實例:word中的字母,系統的文件夾、文件圖標
五、枚舉
在程序開發中會存在一種數據集,數據的集中的值是固定不變的,是窮盡的。如四季,只有春夏秋冬,一年中也只有12個月份。這樣就產生了一種類型,叫枚舉,關鍵字enum
1、作用:限定數據,必須是枚舉類型內指定的值
2、聲明格式:[public] enum 枚舉類型名稱{
枚舉對象1, 枚舉對象2,..., 枚舉對象n;
}
3、細節:
(1)構造器:
1)構造器只是在構造枚舉值的時候被調用。
2)構造器只有私有private,絕不允許有public構造器。這樣可以保證外部代碼無法重新構造枚舉類的實例,因爲枚舉值是public static final的常量,但是枚舉類的方法和數據域是可以被外部訪問的。
3)構造器可以有多個,調用哪個即初始化相應的值。
(2)所有的枚舉類都繼承了Enum方法,方法如下:
非靜態方法:
1)toString() ---> 返回枚舉量的名稱
2)ordina() ---> 返回枚舉值在枚舉類中的順序,按定義的順序排
3)getClass() ---> 獲取對應的類名
靜態方法:
1)valueOf(String e) ---> 轉爲類中對應的對象,即將字符串轉爲對象
2)values() ---> 獲取數組,將元素放入一個數組中。
(3)語法規範
1)元素列表即所有的元素,必須放在整個類的最前面。
2)元素列表後分號可有可無,但元素後面還有其他內容時,必須加上分號。
3)枚舉類中的方法爲private
4)在元素後跟上(),就可指定要使用的構造方法,含參數。
5)枚舉類中的每個元素都是它的一個子類對象,當枚舉類中存在abstract方法,須在子類後加{},並在其中實現此方法。
4、枚舉模擬類:
enum聲明定義的類型就是一個特殊的類,構造方法私有,其中的元素都是該類的實例,均爲靜態。而這些類都是類庫中Enum 類的子類(java.lang.Enum<E>)。它們繼承了這個Enum中的許多有用的方法 。動手寫一個枚舉模擬類
package cn.itheima.blog1; class Season{ //均爲該類的實例 public final static Season SPR = new Season(); public final static Season SUM = new Season(); public final static Season AUT = new Season(); public final static Season WIN = new Season(); //構造方法私有化 private Season(){ } } public class SeasonDemo { public static void main(String[] args) { //只能通過類名建立實例,建立的實例只能是春夏秋冬四個季節 Season s1 = Season.SUM; } }
5、用Enum寫交通信號燈
package cn.itheima.blog1; /* * 枚舉的用法 */ //用enum替代class關鍵字,爲枚舉類型 public enum TrafficLamp { //元素在最前面,後面有內容,需要加上;號 //調用構造函數, RED(57) { public TrafficLamp nextLamp() { return GREEN; } }, GREEN(60) { public TrafficLamp nextLamp() { return YELLOW; } }, YELLOW(3) { public TrafficLamp nextLamp() { return RED; } }; private int time; //抽象方法,子類需要實現 public abstract TrafficLamp nextLamp(); //構造方法私有化 private TrafficLamp(int time) { this.time = time; } }