前面介紹了方法的輸入參數,與輸入參數相對應的則為輸出參數,輸出參數也被稱作方法的返回值,意思是經過方法的處理最終得到的運算數值。這個返回值可能是整型數,也可能是雙精度數,也可能是數組等其它類型,甚至允許不返回任何參數。與輸入參數類似,輸出參數也需要定義數據類型,它的返回值類型在方法名稱前面定義,具體位置參見方法的定義形式“訪問權限類型 可選的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開發筆記(序)章節目錄》