1. 程式人生 > >Java開發筆記(二十六)方法的輸出引數

Java開發筆記(二十六)方法的輸出引數

前面介紹了方法的輸入引數,與輸入引數相對應的則為輸出引數,輸出引數也被稱作方法的返回值,意思是經過方法的處理最終得到的運算數值。這個返回值可能是整型數,也可能是雙精度數,也可能是陣列等其它型別,甚至允許不返回任何引數。與輸入引數類似,輸出引數也需要定義資料型別,它的返回值型別在方法名稱前面定義,具體位置參見方法的定義形式“訪問許可權型別 可選的static 返回值的資料型別 方法名稱(引數型別 引數名稱)”。
這裡特別要注意,即使方法不返回任何輸出引數,也需定義一個名叫void的返回值型別,而不像輸出引數若沒有則直接留空。方法內部倘若中途就要結束處理,那要在指定地點新增一行“return;”,表示程式碼執行到這裡便退出方法。對於無需返回輸出引數的方法,方法末尾既可新增“return;”,也可不新增“return;”,因為此時編譯器會自動結束方法。
接下來以求數字的N次方根為例,演示看看如何實現一個返回值型別為void的printNsquareRoot方法。該方法的輸入引數包括待求N次方根的數字,以及N次方根的整型數n,為了避免程式執行出錯,必須在方法一開頭就進行合法性判斷,比如N次方根的n必須是自然數,而不能是0或負數;又比如進行開偶次方根運算時,底數不能為負數;一旦輸入引數的合法性校驗不通過,就應當跳過剩餘程式碼直接結束方法。據此給出方法printNsquareRoot的示例程式碼:

	// 不返回任何資料,也就是不存在輸出引數,則返回值型別填void。
	// printNsquareRoot的用途是列印指定數字的N次方根
	private static void printNsquareRoot(double number, int n) {
		if (n <= 0) {
			System.out.println("n必須為自然數");
			return; // 不帶任何引數直接返回,return語句表示該方法的剩餘程式碼都不予執行
		} else if (n%2==0 && number<0) {
			System.out.println("不能對負數開偶次方根");
			return; // 不帶任何引數直接返回,return語句表示該方法的剩餘程式碼都不予執行
		}
		// 下面利用牛頓迭代法求數字的N次方根
		double nsquareRoot = number;
		for (int i=0; i<n*2; i++) {
			nsquareRoot = (nsquareRoot*(n-1)+number/Math.pow(nsquareRoot, n-1))/n;
		}
		System.out.println(number+"的"+n+"次方根="+nsquareRoot);
		//return; // 如果方法的返回值型別為void,則方法末尾的return語句可加可不加
	}

 

因為printNsquareRoot方法不返回具體引數,所以外部可通過格式“方法名稱(逗號隔開的引數列表)”呼叫該方法。下面便是外部呼叫printNsquareRoot方法的程式碼例子:

		// 下面的printNsquareRoot方法列印指定數字的N次方根
		printNsquareRoot(2, 2); // 求數字2的2次方根,即對2開平方

 

當然許多時候我們更希望求方根方法能夠返回具體方根數值,那麼就要將方法的返回值型別從void改為double,並且凡是需要結束方法處理的地方,都得使用語句“return 方根數值;”返回輸出引數,並且方法末尾必須寫明return語句。於是求方根方法便改成了如下的程式碼:

	// 只返回一個數值,則返回值型別填該數值的變數型別。
	// getNsquareRoot的用途是計算並返回指定數字的N次方根
	private static double getNsquareRoot(double number, int n) {
		if (n <= 0) {
			System.out.println("n必須為自然數");
			return 0; // 輸入引數非法,則預設返回0
		} else if (n%2==0 && number<0) {
			System.out.println("不能對負數開偶次方根");
			return 0; // 輸入引數非法,則預設返回0
		}
		// 下面利用牛頓迭代法求數字的N次方根
		double nsquareRoot = number;
		for (int i=0; i<n*2; i++) {
			nsquareRoot = (nsquareRoot*(n-1)+number/Math.pow(nsquareRoot, n-1))/n;
		}
		return nsquareRoot; // return後面跟著要返回的變數名稱,該變數的型別與返回值型別保持一致
	}

 

既然改寫後的getNsquareRoot方法存在輸出引數,那麼外部呼叫該方法時,應當定義一個變數用來接收方法的返回值,就像下面程式碼示範的這樣:

		// 下面的getNsquareRoot方法返回指定數字的N次方根
		double number1 = 3;
		int n1 = 2;
		double nsquareRoot = getNsquareRoot(number1, n1);
		System.out.println(number1+"的"+n1+"次方根="+nsquareRoot);

 

執行上面的方法呼叫程式碼,程式的日誌輸出結果如下所示:

3.0的2次方根=1.7320508100147274

 

從日誌發現,getNsquareRoot方法在計算數字的偶次方根時,只會返回正值方根。這其實是不嚴謹的,比如3和-3都是9的平方根,然而getNsquareRoot方法只返回3,卻把-3給漏掉了。因此需要對該方法加以完善,可考慮將返回值型別改為陣列,這樣偶次方根的正值和負值都能通過陣列返回。於是重新定義一個getNsquareRootArray方法,同時新方法的返回值型別為double[],並修改相關的return語句,把返回的輸出引數統統改為陣列型別。經過陣列改造後的getNsquareRootArray方法程式碼如下所示:

	// 需要返回多個數值(包括0個、1個、2個以及更多),則返回值型別可以填這些數值的陣列型別。
	// getNsquareRootArray的用途是計算並返回指定數字的N次方根陣列(比如2和-2都是4的平方根)
	private static double[] getNsquareRootArray(double number, int n) {
		if (n <= 0) {
			System.out.println("n必須為自然數");
			return new double[]{}; // 輸入引數非法,則預設返回一個空的雙精度陣列
		} else if (n%2==0 && number<0) {
			System.out.println("不能對負數開偶次方根");
			return new double[]{}; // 輸入引數非法,則預設返回一個空的雙精度陣列
		}
		// 下面利用牛頓迭代法求數字的N次方根
		double nsquareRoot = number;
		for (int i=0; i<n*2; i++) {
			nsquareRoot = (nsquareRoot*(n-1)+number/Math.pow(nsquareRoot, n-1))/n;
		}
		double[] rootArray;
		if (n%2 == 0) { // 求偶次方根,則方根有正值和負值兩個數值
			rootArray = new double[]{nsquareRoot, -nsquareRoot};
		} else { // 求奇次方根,則方根只會有一個數值
			rootArray = new double[]{nsquareRoot};
		}
		return rootArray; // return後面跟著rootArray,其變數型別與返回值型別一樣都是雙精度陣列
	}

 

外部呼叫getNsquareRootArray方法的時候,需要宣告一個雙精度陣列變數,並將方法的輸出引數賦值給該變數。下面是外部呼叫getNsquareRootArray方法的程式碼例子:

		// 下面的getNsquareRootArray方法返回指定數字的N次方根陣列
		double number2 = 3;
		int n2 = 2;
		double[] rootArray = getNsquareRootArray(number2, n2);
		for (double root : rootArray) {
			System.out.println(number2+"的"+n2+"次方根="+root);
		}

 

執行上述測試程式碼,日誌列印結果如下所示:

3.0的2次方根=1.7320508100147274
3.0的2次方根=-1.7320508100147274

 

可見最新的getNsquareRootArray方法,在計算數字的偶次方根之時,正確返回了兩個正負方根。

 

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