黑馬程序員靜態導入、增強for、可變參數、自動裝箱拆箱、枚舉

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

 

一、靜態導入

  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方法,方法如下:

          非靜態方法:

             1toString() ---> 返回枚舉量的名稱

             2ordina() ---> 返回枚舉值在枚舉類中的順序,按定義的順序排

             3getClass() ---> 獲取對應的類名

          靜態方法:

            1valueOf(String e) ---> 轉爲類中對應的對象,即將字符串轉爲對象

            2values() ---> 獲取數組,將元素放入一個數組中。

   (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;
	}
}



 

 

   

  

 

 

 

 

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