6.1 什麼是方法
我們日常說的方法是爲獲得某種東西或達到某種目的而採取的手段與行爲方式。而現在說的方法有所不同,是具備特定功能的一段獨立的代碼段。
6.2 爲什麼要用方法
舉個例子,比如玩《刺激戰場》遊戲的時候,有個瞄準的動作需要 200 行代碼實現,那麼每次調用瞄準這個動作的時候,都要重複編寫這 200 行代碼,顯然不合理,這樣顯得程序特別臃腫。而且這瞄準的動作出現問題時,就要到處修改這些代碼。維護效率忒低,而且容易出現修改不全面的情況。Java 爲我們提供了一種解決方案,將這 200 行代碼放到一起,作爲一個整體,其他地方需要調用的,直接調用這塊代碼即可。如下圖所示:
6.3 標準的方法格式(注意格式的順序)
標準格式如下:
修飾符 返回值類型 方法名(參數類型 1 參數名 1, 參數類型 2 參數名 2) {
方法體;
return 返回值;
}
注意:在很多語言裏面都有函數的定義,而函數在 Java 中被稱爲方法。
6.3.1 沒有返回值也沒有方法參數
public void 方法名() {
方法體;
}
例子:定義一個打印 20 行“I love Java”的方法並執行。
public static void main(String[] args) {
prin();
}
/**
* 打印
*/
public static void prin() {
for(int i = 0; i < 20; i++) {
System.out.println("I love Java");
}
}
6.3.2 有返回值且有方法參數
public 返回值類型 方法名(參數類型 參數名1,參數類型 參數名2) {
方法體;
return 返回值;
}
例子:計算任意兩個整數的和,並將該結果進行返回。
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("請輸入任意兩個整數求和(空格隔開):");
int num1 = scanner.nextInt();
int num2 = scanner.nextInt();
System.out.println(num1 + "與" +num2 + "和爲:" + sum(num1, num2));
}
/**
* 求和
* @param num1
* @param num2
* @return
*/
public static int sum(int num1, int num2) {
return num1 + num2;
}
寫方法時要明確返回值類型,明確參數列表,定義方法名。
注意:
- 方法不調用不執行;
- 方法與方法是平級關係,不能嵌套定義;
- 方法定義的時候參數之間用逗號隔開;
- 方法調用的時候不用再寫數據類型;
- 如果方法有明確的返回值,一定要有 return 帶回一個值;
- 理解什麼叫形參和什麼叫實參。
例子: 打印一個高爲 5 的直角三角形,要求可以通過方法參數的形式來控制打印的圖形,比如是 * 或 $ 等等。
public static void main(String[] args) {
System.out.println("請輸入你要打印的直角三角形的符號(如 $):");
Scanner scanner = new Scanner(System.in);
sum(scanner.next());
}
/**
* 打印特定符號直角三角形
* @param str 打印的符號
* @return
*/
public static void sum(String str) {
for(int i = 0; i < 6; i++) {
for(int j = 0; j < i; j++) {
System.out.print(str);
}
System.out.println();
}
}
6.4 方法的重載
在同一個類中,方法名相同,參數列表不同的方法叫做方法的重載。比如:
- 求兩個整數的和
- 求三個整數的和
- 求四個整數的和
以上三個方法的功能都是求和,所以類似這種一致的功能,若方法名不同,調用起來不方便,因此通常採用方法名相同,參數列表不同進行方法的重載。
注:
- 重載與返回值無關,只與方法名和參數列表有關;
- 在調用時,虛擬機通過參數列表的不同來區分同名方法。
- 可變參數,後續講解。
6.5 遞歸
直接或間接調用函數本身,則該函數稱爲遞歸函數。例如:求 5!(提示:5!= 5 * 4 * 3 * 2 * 1 = 120)
分析可得:
5! = 5 * 4!
4! = 4 * 3!
3 != 3 * 2!
2 != 2 * 1
可以看出到了 1 就結束了,1 稱爲遞歸的出口。
實現步驟:
- 首先定義一個方法
- 找到出口條件
public static void main(String[] args) {
System.out.println("請輸入求階乘的整數:");
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();
System.out.println(num + "! = " + factorial(num));
}
/**
* 求某個數的階乘
* @param num
* @return
*/
public static int factorial(int num) {
if(num == 1) { // 出口條件
return num;
}
return num * factorial(num - 1);
}
注:遞歸的優劣:
- 優:
- 1)代碼簡潔
- 2)易於理解
- 劣:
- 1)時間和空間的消耗比較大。遞歸由於是函數調用自身,而函數的調用時消耗時間和空間的,每一次函數調用,都需要在內存棧中分配空間以保存參數,返回值和臨時變量,而往棧中壓入和彈出數據也都需要時間,所以降低了效率。
- 2)重複計算。遞歸中又很多計算都是重複的,遞歸的本質時把一個問題分解成兩個或多個小 問題,多個小問題存在重疊的部分,即存在重複計算,如斐波那契數列的遞歸實現。
- 3)調用棧溢出。遞歸可能時調用棧溢出,每次調用時都會在內存棧中分配空間,而棧空間的容量是有限的,當調用的次數太多,就可能會超出棧的容量,進而造成調用棧溢出。
6.6 練習
- 1)對兩個整數變量的值進行互換(不需要第三方變量),請寫出兩種實現方式
注意:開發的時候還是推薦採用第三個變量的方式,可讀性強
-
2)設計一個方法來計算 n + (n - 1) + (n - 2) + … + 3 + 2 + 1 的值。其中 n 的值由用戶輸入,如果輸入的數是8,則計算 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 的值,計算結果應該是 36。
-
3)編寫一個程序,讓用戶輸入一個三位數的正整數值,然後計算該數各位數的和,
例如:如果輸入的數是 123,則計算結果是 6。
可到牛客網做練習。
至此,Java 方法已經基本掌握,接下來請看《7 IntelliJ IDEA 的安裝與使用》