『JavaSE』方法的使用

1、方法的基本用法

1.1 什麼是方法(method)
方法就是一個代碼片段. 類似於 C 語言中的 “函數”. 方法存在的意義:

1)是能夠模塊化的組織代碼(當代碼規模比較複雜的時候).
2)做到代碼被重複使用, 一份代碼可以在多個位置使用.
3)讓代碼更好理解更簡單.
4)直接調用現有方法開發, 不必重複造輪子.

1.2 方法定義語法
基本語法

// 方法定義
public static 方法返回值 方法名稱([參數類型 形參 ...]){
	方法體代碼;
	return 返回值;
}
// 方法調用
返回值變量 = 方法名稱(實參...);

代碼示例: 實現一個方法實現兩個整數相加

class Test {
	public static void main(String[] args) {
		int a = 10;
		int b = 20;
		// 方法的調用
		int ret = add(a, b);
		System.out.println("ret = " + ret);
	}
	// 方法的定義
	public static int add(int x, int y) {
	return x + y;
	}
}
// 執行結果  ret = 30

注意事項
<1>方法定義時, 參數可以沒有. 每個參數要指定類型
<2>方法定義時, 返回值也可以沒有, 如果沒有返回值, 則返回值類型應寫成 void
<3>方法定義時的參數稱爲 “形參”, 方法調用時的參數稱爲 “實參”.
<4>方法的定義必須在類之中, 代碼書寫在調用位置的上方或者下方均可.
<5>Java 中沒有 “函數聲明” 這樣的概念。

1.3 方法調用的執行過程

基本規則
<1>定義方法的時候, 不會執行方法的代碼. 只有調用的時候纔會執行.
<2>當方法被調用的時候, 會將實參賦值給形參.
<3>參數傳遞完畢後, 就會執行到方法體代碼.
<4>一個方法可以被多次調用
<5>當方法執行完畢之後(遇到 return 語句), 就執行完畢, 回到方法調用位置繼續往下執行.

代碼示例: 計算 1! + 2! + 3! + 4! + 5!

class Test {
	public static void main(String[] args) {
		int sum = 0;
		for (int i = 1; i <= 5; i++) {
			sum += factor(i);
		}
		System.out.println("sum = " + sum);
	}
	public static int factor(int n) {
		System.out.println("計算 n 的階乘中! n = " + n);
		int result = 1;
		for (int i = 1; i <= n; i++) {
			result *= i;
		}
		return result;
	}
}
// 執行結果
計算 n 的階乘中! n = 1
計算 n 的階乘中! n = 2
計算 n 的階乘中! n = 3
計算 n 的階乘中! n = 4
計算 n 的階乘中! n = 5
sum = 153

1.4 實參和形參的關係(重要)
代碼示例: 交換兩個整型變量

class Test {
	public static void main(String[] args) {
		int a = 10;
		int b = 20;
		swap(a, b);
		System.out.println("a = " + a + " b = " + b);
	}
	public static void swap(int x, int y) {
		int tmp = x;
		x = y;
		y = tmp;
	}
}
// 運行結果
//a = 10 b = 20

原因分析:剛纔的代碼, 沒有完成數據的交換.對於基礎類型來說, 形參相當於實參的拷貝. 即傳值調用.

int a = 10;
int b = 20;

int x = a;
int y = b;

int tmp = x;
x = y;
y = tmp;
//可以看到, 對 x 和 y 的修改, 不影響 a 和 b

解決辦法: 傳引用類型參數 (例如數組來解決這個問題)

class Test {
	public static void main(String[] args) {
		int[] arr = {10, 20};
		swap(arr);
		System.out.println("a = " + arr[0] + " b = " + arr[1]);
	}
	public static void swap(int[] arr) {
		int tmp = arr[0];
		arr[0] = arr[1];
		arr[1] = tmp;
	}
}
// 運行結果
//a = 20 b = 10

2、方法的重載

同一個方法名字, 提供不同版本的實現, 稱爲方法重載

針對同一個類:
方法名相同
方法的返回值類型不影響重載
方法的參數不同(參數個數或者參數類型)

class Test {
	public static void main(String[] args) {
		int a = 10;
		int b = 20;
		int ret = add(a, b);
		System.out.println("ret = " + ret);
		double a2 = 10.5;
		double b2 = 20.5;
		double ret2 = add(a2, b2);
		System.out.println("ret2 = " + ret2);
	}
	public static int add(int x, int y) {
		return x + y;
	}
}
// 編譯出錯
//Test.java:13: 錯誤: 不兼容的類型: 從double轉換到int可能會有損失
//double ret2 = add(a2, b2);
//由於參數類型不匹配, 所以不能直接使用現有的 add 方法.

class Test {
	public static void main(String[] args) {
		int a = 10;
		int b = 20;
		int ret = add(a, b);
		System.out.println("ret = " + ret);
		
		double a2 = 10.5;
		double b2 = 20.5;
		double ret2 = add(a2, b2);
		System.out.println("ret2 = " + ret2);
		
		double a3 = 10.5;
		double b3 = 10.5;
		double c3 = 20.5;
		double ret3 = add(a3, b3, c3);
		System.out.println("ret3 = " + ret3);
	}
	
	public static int add(int x, int y) {
		return x + y;
	}
	
	public static double add(double x, double y) {
		return x + y;
	}
	
	public static double add(double x, double y, double z) {
		return x + y + z;
	}
}

當兩個方法的名字相同, 參數也相同, 但是返回值不同的時候, 不構成重載

class Test {
	public static void main(String[] args) {
		int a = 10;
		int b = 20;
		int ret = add(a, b);
		System.out.println("ret = " + ret);
	}
	public static int add(int x, int y) {
		return x + y;
	}
	public static double add(int x, int y) {
		return x + y;
	}
}

// 編譯出錯
Test.java:13: 錯誤: 已在類 Test中定義了方法 add(int,int)
public static double add(int x, int y) {
^
1 個錯誤

3. 方法遞歸

3.1 遞歸的概念
一個方法在執行過程中調用自身, 就稱爲 “遞歸”.遞歸相當於數學上的 “數學歸納法”, 有一個起始條件, 然後有一個遞推公式
代碼示例: 遞歸求 N 的階乘

	public static void main(String[] args) {
		int n = 5;
		int ret = factor(n);
		System.out.println("ret = " + ret);
	}
	public static int factor(int n) {
		if (n == 1) {
			return 1;
		}
		return n * factor(n - 1); // factor 調用函數自身
	}
// 執行結果
ret = 120

3.2 遞歸執行過程分析
遞歸的程序的執行過程不太容易理解, 要想理解清楚遞歸, 必須先理解清楚 “方法的執行過程”, 尤其是 “方法執行結束之後, 回到調用位置繼續往下執行”.
3.3 遞歸練習
代碼示例1 按順序打印一個數字的每一位(例如 1234 打印出 1 2 3 4)

public static void print(int num) {
	if (num > 9) {
		print(num / 10);
	}
	System.out.println(num % 10);
}

代碼示例2 遞歸求 1 + 2 + 3 + … + 10

public static int sum(int num) {
if (num == 1) {
return 1;
}
return num + sum(num - 1);
}

代碼示例3 寫一個遞歸方法,輸入一個非負整數,返回組成它的數字之和. 例如,輸入 1729, 則應該返回1+7+2+9,它的和是19

public static int sum(int num) {
	if (num < 10) {
		return num;
	}
	return num % 10 + sum(num / 10);
}

代碼示例4 求斐波那契數列的第 N 項

public static int fib(int n) {
	if (n == 1 || n == 2) {
		return 1;
	}
	return fib(n - 1) + fib(n - 2);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章