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開發筆記(序)章節目錄


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM