Java----方法的基本用法

1. 方法的基本用法

1.1 什麼是方法(method)

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

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

1.2 方法定義語法

基本語法

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

注意事項
1. public 和 static 兩個關鍵字在此處具有特定含義, 我們暫時不討論, 後面會詳細介紹.
2. 方法定義時, 參數可以沒有. 每個參數要指定類型
3. 方法定義時, 返回值也可以沒有, 如果沒有返回值, 則返回值類型應寫成 void
4. 方法定義時的參數稱爲 “形參”, 方法調用時的參數稱爲 “實參”.
5. 方法的定義必須在類之中, 代碼書寫在調用位置的上方或者下方均可.
6. Java 中沒有 “函數聲明” 這樣的概念

1.3 方法調用的執行過程

基本規則

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

1.4 實參和形參的關係

對於基礎類型來說, 形參相當於實參的拷貝. 即 傳值調用

1.5 沒有返回值的方法

方法的返回值是可選的. 有些時候可以沒有的

2. 方法的重載

有些時候我們需要用一個函數同時兼容多種參數的情況, 我們就可以使用到方法重載.

2.1 重載要解決的問題

代碼示例

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 = addInt(a, b);
        System.out.println("ret = " + ret);
        double a2 = 10.5;
        double b2 = 20.5;
        double ret2 = addDouble(a2, b2);
        System.out.println("ret2 = " + ret2);
	}
    public static int addInt(int x, int y) {
        return x + y;
	}
    public static double addDouble(double x, double y) {
        return x + y;
	} 
}

這樣的寫法是對的(例如 Go 語言就是這麼做的), 但是 Java 認爲 addInt 這樣的名字不友好, 不如直接就叫 add

2.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);
        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;
} }

方法的名字都叫 add. 但是有的 add 是計算 int 相加, 有的是 double 相加; 有的計算兩個數字相加, 有的是計算三個數字相加.
同一個方法名字, 提供不同版本的實現, 稱爲方法重載

2.3 重載的規則

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

3. 方法遞歸

3.1 遞歸的概念

一個方法在執行過程中調用自身, 就稱爲 “遞歸”.
遞歸相當於數學上的 “數學歸納法”, 有一個起始條件, 然後有一個遞推公式.
例如, 我們求 N!
起始條件: N = 1 的時候, N! 爲 1. 這個起始條件相當於遞歸的結束條件. 遞歸公式: 求 N! , 直接不好求, 可以把問題轉換成 N! => N * (N-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 遞歸執行過程分析

遞歸的程序的執行過程不太容易理解, 要想理解清楚遞歸, 必須先理解清楚 “方法的執行過程”, 尤其是 “方法執行結束之後, 回到調用位置繼續往下執行”.
代碼示例: 遞歸求 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) { System.out.println("函數開始, n = " + n); if (n == 1) {
System.out.println("函數結束, n = 1 ret = 1");
return 1; }
int ret = n * factor(n - 1);
System.out.println("函數結束, n = " + n + " ret = " + ret); return ret;
}
// 執行結果
 函數開始, n = 5
 函數開始, n = 4
 函數開始, n = 3
 函數開始, n = 2
 函數開始, n = 1
 函數結束, n = 1 ret = 1
 函數結束, n = 2 ret = 2
 函數結束, n = 3 ret = 6
 函數結束, n = 4 ret = 24
 函數結束, n = 5 ret = 120
 ret = 120

執行過程圖在這裏插入圖片描述

程序按照序號中標識的 (1) -> (8) 的順序執行.

*關於 “調用棧”
方法調用的時候, 會有一個 “棧” 這樣的內存空間描述當前的調用關係. 稱爲調用棧.
每一次的方法調用就稱爲一個 “棧幀”, 每個棧幀中包含了這次調用的參數是哪些, 返回到哪裏繼續執行等信息. *

3.3 遞歸小結

遞歸是一種重要的編程解決問題的方式.
有些問題天然就是使用遞歸方式定義的(例如斐波那契數列, 二叉樹等), 此時使用遞歸來解就很容易. 有些問題使用遞歸和使用非遞歸(循環)都可以解決. 那麼此時更推薦使用循環, 相比於遞歸, 非遞歸程序更加高效.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章