【JavaSE】Java方法的使用

【本節目標】

1. 掌握方法的定義以及使用

2. 掌握方法傳參

3. 掌握方法重載

4. 掌握遞歸

目錄

1.方法概念及使用

1.1什么是方法(method)

1.2 方法定義

1.3 方法調用的執行過程

1.4 實參和形參的關系

2. 方法重載

2.1 為什么需要方法重載

2.2 方法重載概念

3. 遞歸

3.1 生活中的故事

3.2 遞歸的概念

3.3 遞歸執行過程分析

3.4 遞歸練習


1.方法概念及使用

1.1什么是方法(method)

方法就是一個代碼片段. 類似于 C 語言中的 "函數"。方法存在的意義(不要背, 重在體會):

1. 是能夠模塊化的組織代碼(當代碼規模比較復雜的時候).

2. 做到代碼被重復使用, 一份代碼可以在多個位置使用.

3. 讓代碼更好理解更簡單.

4. 直接調用現有方法開發, 不必重復造輪子.

1.2 方法定義

方法語法格式

?比如:實現一個兩個整數相加的方法

public static int add(int x,int y){return x+y;
}

寫一個方法,檢測一個年份是否為閏年?

public static boolean isLeapYear(int year) {if ((year % 3 == 0 && year % 100 != 0) || (year % 400 == 0)) {return true;}return false;
}

?【注意事項】

1. 修飾符:現階段直接使用public static 固定搭配

2. 返回值類型:如果方法有返回值,返回值類型必須要與返回的實體類型一致,如果沒有返回值,必須寫成 void

3. 方法名字:采用小駝峰命名

4. 參數列表:如果方法沒有參數,()中什么都不寫,如果有參數,需指定參數類型,多個參數之間使用逗號隔開

5. 方法體:方法內部要執行的語句

6. 在java當中,方法必須寫在類當中

7. 在java當中,方法不能嵌套定義

8. 在java當中,沒有方法聲明一說

1.3 方法調用的執行過程

【方法調用過程】

調用方法--->傳遞參數--->找到方法地址--->執行被調方法的方法體--->被調方法結束返回--->回到主調方法繼續往下執行

?【注意事項】

  • 定義方法的時候, 不會執行方法的代碼. 只有調用的時候才會執行.
  • 一個方法可以被多次調用

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

public class Test {//求n的階乘public static int fac(int n) {int ret = 1;for (int i = 1; i <= n; i++) {ret *= i;}return ret;}//求階乘和public static int facSum(int k){int sum = 0;for (int i = 1; i <= k; i++) {sum+=fac(i);}return sum;}public static void main(String[] args) {int ret = facSum(5);System.out.println(ret);}
}

1.4 實參和形參的關系

方法的形參相當于數學函數中的自變量,比如:1 + 2 + 3 + … + n的公式為sum(n) =

Java中方法的形參就相當于sum函數中的自變量n,用來接收sum函數在調用時傳遞的值的。形參的名字可以隨意取,對方法都沒有任何影響,形參只是方法在定義時需要借助的一個變量,用來保存方法在調用時傳遞過來的值。

?再比如:

注意:在Java中,實參的值永遠都是拷貝到形參中,形參和實參本質是兩個實體

代碼示例: 交換兩個整型變量

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

可以看到,在swap函數交換之后,形參x和y的值發生了改變,但是main方法中a和b還是交換之前的值,即沒有交 換成功。

【原因分析】

實參a和b是main方法中的兩個變量,其空間在main方法的棧(一塊特殊的內存空間)中,而形參x和y是swap方法中 的兩個變量,x和y的空間在swap方法運行時的棧中,因此:實參a和b 與 形參x和y是兩個沒有任何關聯性的變量, 在swap方法調用時,只是將實參a和b中的值拷貝了一份傳遞給了形參x和y,因此對形參x和y操作不會對實參a和b 產生任何影響。

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

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

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

2. 方法重載

2.1 為什么需要方法重載

仍然以之前的加法函數為例子:

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

這串代碼是可以正常運行的,但是有一個局限,那就是當我們是實參不是int類型的數據時,程序就會出錯:

?由于參數類型不匹配, 所以不能直接使用現有的 add 方法.

2.2 方法重載概念

在Java中,方法重載(Method Overloading)是指在同一個類中可以存在多個同名的方法,但它們的參數列表不同。通過方法重載,可以根據傳入的不同參數來調用不同的方法實現,提供了更靈活和方便的方式來處理不同的情況。

方法重載的規則如下:

  • 方法名稱必須相同。
  • 方法參數列表必須不同,可以通過參數的個數、類型或順序進行區分。

方法重載與返回值類型是否相同無關

兩個方法如果僅僅只是因為返回值類型不同,是不能構成重載的

下面是一個示例來說明方法重載的概念:

public class MyClass {public static void main(String[] args) {int sum1 = addNumbers(2, 3);double sum2 = addNumbers(2.5, 3.8);int sum3 = addNumbers(1, 2, 3);System.out.println("Sum1: " + sum1);System.out.println("Sum2: " + sum2);System.out.println("Sum3: " + sum3);}public static int addNumbers(int a, int b) {return a + b;}public static double addNumbers(double a, double b) {return a + b;}public static int addNumbers(int a, int b, int c) {return a + b + c;}
}

3. 遞歸

3.1 生活中的故事

從前有坐山,山上有座廟,廟里有個老和尚給小和尚將故事,講的就是:

"從前有座山,山上有座廟,廟里有個老和尚給小和尚講故事,講的就是:

"從前有座山,山上有座廟..."

"從前有座山……" "

?上面的兩個故事有個共同的特征:自身中又包含了自己,該種思想在數學和編程中非常有用,因為有些時候,我們 遇到的問題直接并不好解決,但是發現將原問題拆分成其子問題之后,子問題與原問題有相同的解法,等子問題解 決之后,原問題就迎刃而解了

3.2 遞歸的概念

一個方法在執行過程中調用自身, 就稱為 "遞歸".

遞歸相當于數學上的 "數學歸納法", 有一個起始條件, 然后有一個遞推公式.

例如, 我們求 N!

起始條件: N = 1 的時候, N! 為 1. 這個起始條件相當于遞歸的結束條件.

遞歸公式: 求 N! , 直接不好求, 可以把問題轉換成 N! => N * (N-1)!

遞歸的必要條件:

1. 將原問題劃分成其子問題,注意:子問題必須要與原問題的解法相同

2. 遞歸出口

代碼示例: 遞歸求 N 的階乘

3.3 遞歸執行過程分析

遞歸的程序的執行過程不太容易理解, 要想理解清楚遞歸, 必須先理解清楚 "方法的執行過程", 尤其是 "方法執行結束 之后, 回到調用位置繼續往下執行".

public class Test{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;}
}

?執行過程圖

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

關于 "調用棧"

方法調用的時候, 會有一個 "棧" 這樣的內存空間描述當前的調用關系. 稱為調用棧.

每一次的方法調用就稱為一個 "棧幀", 每個棧幀中包含了這次調用的參數是哪些, 返回到哪里繼續執行等信息.

后面我們借助 IDEA 很容易看到調用棧的內容.

3.4 遞歸練習

代碼示例1 按順序打印一個數字的每一位(例如 1234 打印出 1 2 3 4)

public class Test {public static void print(int n) {if (n >= 10) {print(n / 10);}System.out.print(n % 10 + " ");}public static void main(String[] args) {print(1234567);}
}

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

public class Test {public static int sum(int n) {if(n==1){return 1;}return n + sum(n-1);}public static void main(String[] args) {int ret = sum(10);System.out.println(ret);}
}

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

public class Test {public static int add(int n) {if (n < 10) {return n;}return n % 10 + add(n / 10);}public static void main(String[] args) {int ret = add(12345);System.out.println(ret);}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/41267.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/41267.shtml
英文地址,請注明出處:http://en.pswp.cn/news/41267.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【uni-app報錯】獲取用戶收貨地址uni.chooseAddress()報錯問題

chooseAddress:fail the api need to be declared in …e requiredPrivateInf 原因&#xff1a; 小程序配置 / 全局配置 (qq.com) 解決&#xff1a; 登錄小程序后臺申請接口 按照流程申請即可 在項目根目錄中找到 manifest.json 文件&#xff0c;在左側導航欄選擇源碼視圖&a…

杭電比賽總結

我們的隊伍&#xff1a;team013 另外兩隊&#xff1a;team014、team015 ? 今天是我第一次打杭電&#xff0c;發現杭電多數都是猜結論題 先給一下我們的提交數據 Submit TimeProblem IDTimeMemoryJudge Status4:59:59101115 MS1692 KWrong Answer4:59:55101115 MS1684 KWrong…

Java算法_ 檢查對稱樹(LeetCode_Hot100)

題目描述&#xff1a;給你一個二叉樹的根節點 &#xff0c; 檢查它是否軸對稱。root 獲得更多&#xff1f;算法思路:代碼文檔&#xff0c;算法解析的私得。 運行效果 完整代碼 /*** 2 * Author: LJJ* 3 * Date: 2023/8/17 8:47* 4*/ public class SymmetricTree {static class…

vue之動態表單(優化)

代碼資源在這兒 ↑ vue之動態表單優化 vue2js動態表單優化vue3ts動態表單優化 vue2js動態表單優化 效果圖 目錄結構 五個文件的完整代碼: 以下是App.vue <template><div><router-view></router-view><Formpage /></div> </templa…

【LeetCode】647.回文子串

題目 給你一個字符串 s &#xff0c;請你統計并返回這個字符串中 回文子串 的數目。 回文字符串 是正著讀和倒過來讀一樣的字符串。 子字符串 是字符串中的由連續字符組成的一個序列。 具有不同開始位置或結束位置的子串&#xff0c;即使是由相同的字符組成&#xff0c;也會…

web連接桌面打開gptmap

一&#xff1a;環境配置 需要的材料&#xff1a; python-3.10.4 我使用的是這個版本的&#xff0c;3.8.10 該版本和以下版本組件組合&#xff0c;驗證過能正常運行&#xff08;python 3.6.8測試異常&#xff09; websockify 該項目有python版本和node js版本 noVNC 形式的app…

Qt Designer設計的界面如何顯示、即運行顯示窗口界面

首先利用Qt Designer設計.ui文件&#xff0c;然后采用Tools->External Tools->PyUIC轉換成.py文件。這個.py文件是.ui文件編譯而來的&#xff0c;將這種文件由.ui文件編譯而來的.py文件稱之為界面文件。由于界面文件每次編譯時候都會初始化&#xff0c;所以需要新建一個.…

Android 13 添加自定義分區,恢復出廠設置不被清除

需求: 客戶有些文件或數據,需要做得恢復出廠設置還存在,故需新增一個分區存儲客戶數據。 要求: a) 分區大小為50M b) 應用層可讀可寫 c) 恢復出廠設置后不會被清除 d) 不需要打包.img e) 不影響OTA升級 缺點: 1).通過代碼在分區創建目錄和文件,會涉及到SeLinux權限的修…

● 123.買賣股票的最佳時機III ● 188.買賣股票的最佳時機IV

123.買賣股票的最佳時機III class Solution { public:int maxProfit(vector<int>& prices) {vector<vector<int>>dp(prices.size(),vector<int>(5));int lenprices.size();if(len0)return 0;dp[0][0]0;dp[0][1]-prices[0];dp[0][2]0;dp[0][3]-pr…

LeetCode150道面試經典題-- 環形鏈表(簡單)

1.題目 給你一個鏈表的頭節點 head &#xff0c;判斷鏈表中是否有環。 如果鏈表中有某個節點&#xff0c;可以通過連續跟蹤 next 指針再次到達&#xff0c;則鏈表中存在環。 為了表示給定鏈表中的環&#xff0c;評測系統內部使用整數 pos 來表示鏈表尾連接到鏈表中的位置&…

Java設計模式 (一) 模板方法設計模式

什么是模板方法設計模式? 模板方法設計模式是一種行為型設計模式&#xff0c;它定義了一個算法的骨架&#xff0c;并將一些步驟的具體實現延遲到子類中。模板方法模式可以幫助確保在算法的不同部分中保持一致性&#xff0c;同時也允許子類根據需要進行具體實現。 模板方法模式…

分布式光伏運維平臺在公益場館屋頂光伏發電系統的應用分析

摘要&#xff1a;2021年9月&#xff0c;國家發改委印發烷善能源消費強度和總量雙控制度方案》&#xff0c;提出鼓勵可再生能源的使用&#xff0c;支持可再生能源發展。在這樣的政策推動下&#xff0c;光伏發電市場無疑將迎來高質量發展的新機遇。現結合山東博物館光伏電站日常管…

系統架構設計師---計算機基礎知識之數據庫系統結構與規范化

目錄 一、基本概念 二、 數據庫的結構 三、常用的數據模型 概念數據模型

git add 用法

git add 是 Git 的一個命令&#xff0c;用于將更改的文件加入到暫存區&#xff08;staging area&#xff09;&#xff0c;準備提交這些更改。以下是該命令的常見用法&#xff1a; 添加單個文件 git add 文件名添加多個文件 git add 文件名1 文件名2 ...添加所有當前目錄下的更改…

面試攻略,Java 基礎面試 100 問(十八)

JAVA IO 包 JAVA NIO NIO 主要有三大核心部分&#xff1a;Channel(通道)&#xff0c;Buffer(緩沖區), Selector。 傳統 IO 基于字節流和字 符流進行操作&#xff0c;而 NIO 基于 Channel 和 Buffer(緩沖區)進行操作&#xff0c;數據總是從通道讀取到緩沖區 中&#xff0c;或者…

Linux命令(70)之bzip2

linux命令之bzip2 1.bzip2介紹 linux命令bzip2是用來壓縮或解壓縮文件名后綴為".bz2"的文件 2.bzip2用法 bzip2 [參數] filename bzip2常用參數 參數說明-d解壓縮文件-t測試壓縮文件是否正確-k壓縮后&#xff0c;保留源文件-z強制壓縮-f強制覆蓋已存在的文件-v顯…

TRT8系列—— 版本差異注意事項

TRT8 一個大版本&#xff0c;8.4-、 8.5、 8.6&#xff08;包含預覽功能&#xff09;卻有很多變動&#xff0c;一不注意就發現很混亂&#xff0c;特備注此貼。建議具體case可以參考這個合集&#xff0c;真心安利&#xff1a;https://github.com/NVIDIA/trt-samples-for-hackath…

Go語言GIN框架安裝與入門

Go語言GIN框架安裝與入門 文章目錄 Go語言GIN框架安裝與入門1. 創建配置環境2. 配置環境3. 下載最新版本Gin4. 編寫第一個接口5. 靜態頁面和資源文件加載6. 各種傳參方式6.1 URL傳參6.2 路由形式傳參6.3 前端給后端傳遞JSON格式6.4 表單形式傳參 7. 路由和路由組8. 項目代碼mai…

GaussDB 實驗篇+openGauss的4種1級分區案例

? 范圍分區/range分區 -- 創建表 drop table if exists zzt.par_range; create table if not exists zzt.par_range (empno integer,ename char(10),job char(9),mgr integer(4),hiredate date,sal numeric(7,2),comm numeric(7,2),deptno integer,constraint pk_par_emp pri…

除自身以外數組的乘積(c語言詳解)

題目&#xff1a;除自身外數組的乘積 給你一個整數數組 nums&#xff0c;返回 數組 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘積 。 題目數據保證數組 nums之中任意元素的全部前綴元素和后綴的乘積都在 32 位 整數范圍內。 請不要使用除…