Java開發筆記(二十五)方法的輸入參數

前面經過main方法介紹了方法的定義形式,對於方法的輸入參數來講,還有幾個值得注意的地方,接下來分別對輸入參數的幾種用法進行闡述。
一個方法能夠有輸入參數,也能夠沒有輸入參數,假若無需輸入參數,則方法定義的圓括號內部直接留空。以打印當前時間爲例,下面的showTime方法沒有輸入參數也能正常實現:html

	// 沒有輸入參數,則方法名稱後面的圓括號內部留空。
	// showTime方法的用途是顯示當前時間
	private static void showTime() {
		Date date = new Date(); // 建立一個時間對象
		int hour = date.getHours(); // 獲取當前時鐘
		int minute = date.getMinutes(); // 獲取當前分鐘
		int second = date.getSeconds(); // 獲取當前秒鐘
		System.out.println("當前時間是"+hour+"時"+minute+"分"+second+"秒");
	}

 

在main方法裏面只要如下簡簡單單的一行代碼,便可調用showTime方法,併成功運行showTime內部的時間打印代碼:java

		showTime();

 

固然,方法定義的多數狀況是存在輸入參數的,而且參數格式爲「參數類型 參數名稱」。像鬧鐘的設置操做,就必須輸入鬧鐘提醒的時分秒,或者設定鬧鐘在當前時刻以後的某個時間觸發。因而造成了下述的setAlarm方法,該方法容許延遲若干小時後打印日誌:數組

	// 只有一個輸入參數,參數格式爲「參數類型 參數名稱」
	// setAlarm方法的用途是設置指定時刻的鬧鐘,其中時鐘爲在當前時間上增長若干小時
	private static void setAlarm(int addedHour) {
		Date date = new Date();
		int hour = date.getHours()+addedHour;
		int minute = date.getMinutes();
		int second = date.getSeconds();
		System.out.println("設定的鬧鐘時間是"+hour+"時"+minute+"分"+second+"秒");
	}

 

如需設定鬧鐘在一個小時後觸發,則調用setAlarm方法時可填寫參數1,正以下面這行代碼:日誌

		setAlarm(1);

 

若想輸入多個參數,那麼在圓括號內經過逗號來分隔參數列表。例以下面的setAlarm方法,支持同時輸入小時數和分鐘數:htm

	// 有兩個輸入參數,參數格式爲「參數1類型 參數1名稱, 參數2類型 參數2名稱」
	// 下面的setAlarm方法與上面的setAlarm方法名稱相同,但參數個數不一樣,該狀況被稱做方法重載。
	// 雖然兩個方法的方法名稱同樣,可是編譯器仍然可以根據參數個數和參數類型來判斷當前要調用的是哪一個方法
	private static void setAlarm(int addedHour, int addedMinute) {
		Date date = new Date();
		int hour = date.getHours()+addedHour;
		int minute = date.getMinutes()+addedMinute;
		int second = date.getSeconds();
		System.out.println("設定的鬧鐘時間是"+hour+"時"+minute+"分"+second+"秒");
	}

 

注意到帶兩個參數的setAlarm方法和帶一個參數的setAlarm方法竟然同名,爲啥變量不能重名,方法卻能重名呢?這是由於這兩個方法的參數個數不同,即便代碼裏的方法名稱看起來相同,其實編譯器會偷偷給它倆更名。好比只帶一個參數的setAlarm方法,編譯器給它的編號多是「setAlarm_1」;而帶兩個參數的setAlarm方法,編譯器可能給它分配編號「setAlarm_2」。因此只要參數個數不一樣,或者參數類型不一樣,代碼中的同名方法都會被編譯器看成不一樣的方法,這種狀況也稱做「方法重載」。
有了方法重載,再來第三個、第四個參數,也能經過重載同名方法來實現。但是如此一來,方法數量就多了許多,有沒有一種機制可以動態調整參數的個數呢?該機制在Java中叫作可變參數,意思是參數的個數是容許變化的,只要這些參數的類型保持一致便可。仍舊以鬧鐘爲例,提醒的時間單位時、分、秒分別對應三個整形參數,那麼徹底能夠定義整型的可變參數,參數的數量可多可少,有幾個參數就用幾個參數。Java的參數「可變」符號利用變量類型後面的三點號「...」來表示,好比「int...」表示整型的可變參數,而「double...」表示雙精度型的可變參數。因而採用了可變參數的setAlarm方法便改寫成下面這樣:對象

	// 參數類型後面添加三個點號「...」,表示這裏的參數數量並不固定,能夠有一個、兩個,也能夠有三個,也能夠沒有參數。
	// 故而此時的輸入參數被稱爲可變參數,意思是參數的數量容許變化,「...」能夠看做是方法參數的省略號。
	private static void setAlarm(int... addedNumber) {
		Date date = new Date();
		int hour = date.getHours();
		int minute = date.getMinutes();
		int second = date.getSeconds();
		// 可變參數的數量也是經過「.length」得到
		if (addedNumber.length > 0) {
			// 獲取指定位置的可變參數,依然經過下標「[數字]」實現,就像是訪問數組元素通常
			hour += addedNumber[0];
		}
		if (addedNumber.length > 1) {
			minute += addedNumber[1];
		}
		if (addedNumber.length > 2) {
			second += addedNumber[2];
		}
		System.out.println("可變參數設定的鬧鐘時間是"+hour+"時"+minute+"分"+second+"秒");
	}

 

外部調用帶可變參數的方法之時,既容許不輸入任何參數,也容許輸入多個參數。如下即爲擁有可變參數的setAlarm方法的調用代碼例子:blog

		setAlarm();
		setAlarm(1, -10, 3);

 

注意,若是已經存在同名且參數個數肯定的方法,則編譯器優先調用參數個數肯定的方法。只有不存在參數個數肯定的同名方法,編譯器纔會調用定義了可變參數的方法。
輸入參數的類型還能夠是數組,例如整型數組的參數定義格式爲「int[] 參數名稱」,這樣方法內部就能將該參數看成數組同樣來操做。使用了數組參數的鬧鐘設置方法setAlarmByArray代碼示例以下:開發

	// 編譯器認爲「int...」與「int[] 」類型相同,
	// 因此不容許定義參數分別爲「int...」和「int[] 」的同名方法
	private static void setAlarmByArray(int[] addedNumber) {
		Date date = new Date();
		int hour = date.getHours();
		int minute = date.getMinutes();
		int second = date.getSeconds();
		if (addedNumber.length > 0) {
			hour += addedNumber[0];
		}
		if (addedNumber.length > 1) {
			minute += addedNumber[1];
		}
		if (addedNumber.length > 2) {
			second += addedNumber[2];
		}
		System.out.println("設定的鬧鐘時間是"+hour+"時"+minute+"分"+second+"秒");
	}

 

可見該方法的內部代碼居然與採用可變參數的setAlarm代碼是同樣的,這緣於編譯器把「int...」和「int[]」看做是同一種類型,既然是同一種類型,那麼這兩個辦法就不能叫同樣的名稱,只能換別的名稱才行。此外,兩者被外部調用時也有差異,帶可變參數的方法,調用時輸入的參數列表以逗號分隔;而帶數組參數的方法,它的輸入參數必須是數組類型,就像下面的調用代碼例子那樣:get

		// 下面setAlarmByArray方法的輸入參數爲數組類型
		int[] addedArray = {1, -10, 3};
		setAlarmByArray(addedArray);

 

至此終於把方法的幾種輸入參數變化講完了,最後總結一下與輸入參數有關的幾個要點:
一、兩個名稱相同,可是參數個數與參數類型不一樣的方法,是經過方法重載機制區分開的。
二、輸入參數在變量類型後面添加三點號「...」,表示這個輸入參數是可變參數,調用時填寫的參數數量可多可少。
三、可變參數與數組參數在方法內部的處理代碼基本沒有區別,但在外部調用時書寫的參數形式是不同的。編譯器

 

更多Java技術文章參見《Java開發筆記(序)章節目錄

相關文章
相關標籤/搜索