1. 程式人生 > >1.5新特性靜態匯入、增強for、可變引數、自動裝箱拆箱、列舉

1.5新特性靜態匯入、增強for、可變引數、自動裝箱拆箱、列舉

第一  靜態匯入

一、概述:

1、import語句:是匯入一個類或某個包中的所有類。

2、import static語句:匯入一個類中的某個靜態方法或所有靜態方法。

3、特點:簡化了書寫,但是程式碼的閱讀性較差。

import static java.lang.Math.*;

/*
 * 1.5新特性
 * 靜態匯入
 */
public class StaticImport {
	public static void main(String[] args) {
		System.out.println(abs(3 - 6));
	}
}

第二  增強for迴圈

一、概述

1、語法:for(可加修飾符 type 變數名 : 集合){statement}

2、注意:迭代變數必須定義在()中,集合必須是實現Iterable介面的集合類,變數型別前可加修飾符,如final(可被區域性內部類訪問到)。

/*
 * 1.5新特性
 * 
 * 增強for迴圈
 * 格式:for(可以新增修飾符 type 變數名 :集合){}
 * 這裡的集合必須是實現了Iterable
 */
public class EnhanceFor {
	public static void main(String[] args) {
		System.out.println(variableParameter(1, 2, 5, 8, 6));
	}

	/*
	 * 可變引數的方法 可變引數只能放與最後
	 */
	public static int variableParameter(int x, int... arr) {
		int sum = 0;
		// 可變引數其實內部封裝了陣列,按照陣列方式取值
		for (int num : arr) {
			sum += num;
		}
		return sum;
	}
}

第三  可變引數

一、概述:

所謂的可變引數就是引數個數不固定,就是方法的過載。

二、特點:

1、只能出現在引數列表的最後。

2、用…這三個點表示引數可以有很多,且這三個點位於變數型別和變數名之間,前後有無空格皆可。

3、呼叫可變引數的方法時,編譯器為該可變引數隱含建立一個數組,在方法體中以陣列的形式訪問可變引數。

/*
 * 1.5新特性
 * 
 * 可變引數
 */
public class VariableParameter {
	public static void main(String[] args) {
		System.out.println(variableParameter(1, 2, 5, 8, 6));
	}
	
	/*
	 * 可變引數的方法
	 * 可變引數只能放與最後
	 */
	public static int variableParameter(int x, int... arr){
		int sum = 0;
		//可變引數其實內部封裝了陣列,按照陣列方式取值
		for(int i=0; i<arr.length; i++){
			sum += arr[i];
		}
		return sum;
	}
	
}

四  自動裝箱拆箱

一、概述:

1、自動裝箱:Integer i = 3;

2、自動拆箱:i + 2;

3、對於基本資料型別的說明:整數在-128 ~ 127之間的數,包裝成Integer型別物件,會存入常量池中的快取,再建立同一個物件的時候,會直接使用前一個已有的值,因為這些小數值使用的頻率很高,所以這些數值需要如此的使用以優化記憶體。

/*
 * 1.5新特性:
 * 自動裝箱和拆箱
 */
public class AutoBox {
	public static void main(String[] args) {
		Integer i = 123;//自動裝箱
		System.out.println(i);//自動拆箱
		
		Integer i1 = 127;
		Integer i2 = 127;
		System.out.println(i1 == i2);
		
		Integer i3 = 128;
		Integer i4 = 128;
		System.out.println(i3 == i4);
		
		/*
		 * 享元模式:
		 * 就是將小的,經常用的放在常量池中,可供分享,這樣就不用建立那麼多物件,優化記憶體
		 * 如正數的-128~127
		 */
		Integer i5 = Integer.valueOf(50);
		Integer i6 = Integer.valueOf(50);
		System.out.println(i5 == i6);
		
		Integer i7 = Integer.valueOf(-158);
		Integer i8 = Integer.valueOf(-158);
		System.out.println(i7 == i8);
	}
}

4、享元模式(flyweight):

1)概述:如果很多很小的物件,他們有很多相同的屬性,那麼就可變為一個物件使用,這些屬性稱為內部狀態,還有些不同的屬性,作為方法引數植入,這些稱為外部狀態。這種優化記憶體,只建立一個物件的模式,稱之為享元模式。

2)應用:

①、word中輸入英文字母,可建立26物件,每個物件值是出現的位置不同(座標),所以可用一個物件呼叫位置的方法:如,字母i:i.display(intx,int y),將高度重複使用的char型別的字母i封裝成一個物件使用。

②、圖示:window下的資料夾圖示,只喲名稱這個屬性不同,包含了很多其他相同的屬性,那麼可以應用享元模式。

第五  列舉

一、概述:

1、在實際程式設計中,往往存在著這樣的“資料集”,它們的數值在程式中是穩定的,而且“資料集”中的元素是有限的。例如星期一到星期日七個資料元素組成了一週的“資料集”,春夏秋冬四個資料元素組成了四季的“資料集”。而在java中就是通過列舉對特定的"資料集"進行限定的。

2、列舉的作用:一些程式在執行時,它需要的資料不是任意的,而是必須在一定範圍內的值

舉例說明,沒有列舉的時候,就是通過自定義類來實現限定的,類似下面列印成績的程式,但是成績只有ABCDE五個等級,所以需要對其進行限定。

//沒有列舉的時候:
class Demo{
	
	public void test(){
		print(Gread.B);
	}
	
	public void print(Gread g){
		//列印成績,只能接收ABCDE
	}
}

class Gread{
	private Gread(){}
	
	public static final Gread A = new Gread();
	public static final Gread B = new Gread();
	public static final Gread C = new Gread();
	public static final Gread D = new Gread();
	public static final Gread E = new Gread();
}
有了列舉:
enum Gread{
	A,B,C,D,E;
}
首先不明白不要緊,但是直觀的效果就是簡化了書寫,讓程式碼更加簡單了。其實列舉簡單的說就是限定條件,讓特定的“資料集”不會超出預定的範圍。

enum很像特殊的class,實際上enum宣告定義的型別就是一個類,而且是一個不可被繼承的final類,其中的元素都是類靜態常量。而這些類都是類庫中Enum類的子類(java.lang.Enum<E>)。它們繼承了這個Enum中的許多有用的方法 
二、列舉的特徵及用法:

public class EnumTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		WeekDay2 weekday2 = WeekDay2.MON;
		System.out.println(weekday2.nextDay());

		WeekDay weekday = WeekDay.FRI;
		System.out.println(weekday);
		System.out.println(weekday.name());
		System.out.println(weekday.ordinal());
		System.out.println(WeekDay.valueOf("SUN"));
		System.out.println(WeekDay.values().length);// WeekDay.values(),返回陣列

		TrafficLamp tf = TrafficLamp.GREEN;
		System.out.println(tf);
	}

	// (內部類)定義星期
	public enum WeekDay {
		SUN(1), MON(1, 1), TUE, WED, THL, FRI, SAT;// 元素列表
		// 其他成員只能放於元素列表之後
		private WeekDay() {
			System.out.println("first");
		}

		private WeekDay(int day) {
			System.out.println("second");
		}

		private WeekDay(int day, int d) {
			System.out.println("third");
		}
	}

	// 定義交通燈
	public enum TrafficLamp {
		// RED,GREEN,YELLOW;
		// 子類實現父類的抽象方法
		RED(30) {//呼叫建構函式,並覆蓋父類中的抽象方法
			@Override
			public TrafficLamp nextLamp() {
				return GREEN;
			}
		},
		GREEN(40) {
			@Override
			public TrafficLamp nextLamp() {
				return YELLOW;
			}
		},
		YELLOW(5) {
			@Override
			public TrafficLamp nextLamp() {
				return RED;
			}
		};

		private int time;

		// 構造方法
		private TrafficLamp(int time) {
			this.time = time;
		}

		//抽象方法,子類必須實現
		public abstract TrafficLamp nextLamp();
	}

}

1、構造器:

1)構造器只是在構造列舉值的時候被呼叫。

2)構造器只有私有private,絕不允許有public構造器。這樣可以保證外部程式碼無法重新構造列舉類的例項,因為列舉值是public static final的常量,但是列舉類的方法和資料域是可以被外部訪問的。

3)構造器可以有多個,呼叫哪個即初始化相應的值。

2、所有的列舉類都繼承了Enum方法,方法如下:

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

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

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

靜態方法:

1)valueOf(String e) ---> 轉為類中對應的物件,即將字串轉為物件

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

三、注意:

1、元素列表即所有的元素專案,必須放在整個類的最前面。

2、元素列表後要可有可無分號,但是元素後面還有其他專案時,必須加上分號。

3、列舉類中的方法為private

4、在元素後跟上(),就可指定要使用的構造方法,含引數。

5、列舉類中的每個元素都是它的一個子類物件,當列舉類中存在abstract方法,須在子類後加{},並在其中實現此方法。

四、總結:

1、匿名內部類比較常用

2、類的方法返回的型別可以是類的型別

3、類中可定義靜態常量,常量的結果就是自己這個型別的例項物件

4、如果列舉只有一個成員,就可以作為一種單例的實現方式,物件只有一個。