 詳解)
一、引入如果程序中大量書寫重復代碼會帶來以下問題代碼冗余可讀性低后期不利于維護解決思路 把重復的代碼只定義一次給這段代碼起名字后續需要使用時直接通過名字調用執行。二、函數1. 概念函數是實現特定功能的一段程序代碼可以通過函數名字被反復調用使用。2. 函數的使用流程函數的定義函數的聲明確定函數功能、函數名稱、參數、返回值函數的實現書寫函數內部具體業務代碼函數的調用通過函數名字執行函數完成對應功能3. 函數定義位置函數定義在類內部其他函數外部。當前階段和 main 方法并列書寫。三、函數的定義1. 基礎語法public static void 函數名字(數據類型 變量名){ // 函數體實現功能的代碼 }函數三要素返回值、函數名、形參列表。2. 函數名遵循標識符命名規范見名知意小駝峰命名第一個單詞首字母小寫其余單詞首字母大寫3. 參數參數調用者和函數之間傳遞的數據。語法public static void 函數名字(數據類型 變量名,數據類型 變量名)形式參數形參定義函數時括號中聲明的變量。相當于函數內部的局部變量函數內部直接使用參數名。一個函數可以有多個形參每個參數都必須寫數據類型類型相同也不能省略類型多個參數用逗號隔開。形參列表長度0 ~ n個。4. 返回值1void無返回值void代表函數不需要向調用者返回結果。public static void 函數名(形參列表){ // 可以不寫return // 也可以寫 return; 作用直接結束當前函數 return; }2有返回值8 種基本類型 / 引用類型函數執行完成后需要把結果返回給調用處。public static 數據類型 函數名(形參列表){ return xxx; // return后面數據類型必須和函數聲明的返回值類型保持一致 }return 兩大作用將函數執行結果返回給調用者結束當前函數return之后不能書寫其他執行語句return 使用細節函數返回值類型不為void函數中必須保證有 return 返回數據。如果 return 寫在分支內部必須保證每一條分支路徑都存在 return 語句否則編譯報錯。四、函數的調用1. 無參函數調用函數名();2. 帶參數函數調用函數名(實參1,實參2,實參3);實際參數實參調用函數時傳入的數據用來給形參賦值。 ??實參的類型、個數、順序必須和形參列表保持一致。3. 帶返回值函數調用數據類型 變量名 函數名(實參);有返回值函數三種處理方式使用相同類型變量接收返回值最常用數據類型 變量 函數名(實參);直接調用不接收返回值實際開發極少使用函數名(實參);直接寫在打印語句或者運算表達式中只使用一次結果System.out.println(函數名(實參)); int res 10 函數名(實參);注意void無返回值函數不能直接放入System.out.println()打印。五、函數的作用減少代碼冗余提高代碼可讀性提高代碼可維護性提高代碼復用性便于團隊分工、協同開發六、函數的嵌套調用1. 概念在一個函數內部調用另外一個函數。2. 執行原理程序從上向下執行遇到函數調用跳轉到被調用函數執行被調用函數全部執行完畢之后攜帶返回值回到調用位置繼續向下執行原有函數剩余代碼。3. JVM 棧內存簡單理解JVM 虛擬機棧是 Java 函數執行的內存模型。每一個函數執行都會創建一塊棧幀 (Stack Frame)。棧幀保存局部變量表、操作數棧、函數出口等信息。函數執行結束返回調用位置該函數對應的棧幀內存直接回收。七、遞歸遞歸概念函數的內部調用函數自身稱為遞歸調用。??無窮遞歸會拋出異常java.lang.StackOverflowError棧溢出。寫遞歸一定要定義遞歸出口終止條件避免無限調用。案例階乘計算。適用場景復雜問題可以拆解成若干相同邏輯的子問題。