Java程序中方法的用法重載和遞歸
前言
“方法”又被稱為“函數(shù)”,其他的編程語言也有這個(gè)概念,重要性不言而喻,在這個(gè)文章,將介紹如何定義和使用方法。
一、方法的基本用法
1.什么是方法
在Java中,方法定義在類中,它和類的成員屬性(數(shù)據(jù)成員)一起構(gòu)建一個(gè)完整的類。構(gòu)成方法有四大類——返回值類型、方法名稱、參數(shù)、方法體。
方法就像一個(gè)功能,當(dāng)我們需要用到的時(shí)候,就去調(diào)用它,不用的時(shí)候就放到一邊。
也可以說它是一本工具書,當(dāng)我們需要查看的時(shí)候,我們就會(huì)去找這本書查資料,不用的時(shí)候就放在書柜里面。
2.方法的基本定義
//方法定義
public static 方法返回值 方法名稱([參數(shù)類型 形參 …]){
方法體代碼;
[return 返回值];
}
// 方法調(diào)用
返回值變量 = 方法名稱(實(shí)參…);
可以看出,方法包含一個(gè)方法頭和一個(gè)方法體。
返回值類型:指定了方法返回的數(shù)據(jù)類型。它可以是任意有效的類型,包括構(gòu)造類型(類就是一種構(gòu)造類型)。如果方法沒有返回值,則其返回類型必須是void。方法體中的返回值類型要與方法頭中定義的返回值類型一致。
public class TestDemo {
public static void main(String[] args) {
int a = 10;
int b = 20;
// 方法的調(diào)用
int ret = add(a, b);
System.out.println("ret = " + ret);
}
// 方法的定義
public static int add(int x, int y) {
return x + y;
}
}

3.方法調(diào)用的執(zhí)行過程
- 定義方法的時(shí)候, 不會(huì)執(zhí)行方法的代碼. 只有調(diào)用的時(shí)候才會(huì)執(zhí)行.
- 當(dāng)方法被調(diào)用的時(shí)候, 會(huì)將實(shí)參賦值給形參.
- 參數(shù)傳遞完畢后, 就會(huì)執(zhí)行到方法體代碼.
- 當(dāng)方法執(zhí)行完畢之后(遇到 return 語句), 就執(zhí)行完畢, 回到方法調(diào)用位置繼續(xù)往下執(zhí)行.
- 一個(gè)方法可以被多次調(diào)用
4.方法中的實(shí)參和形參
形參:
在定義一個(gè)方法時(shí),參數(shù)列表中的參數(shù)個(gè)數(shù)至少為1個(gè)。
實(shí)參:
調(diào)用方法時(shí),需要調(diào)用者提供與原方法定義相匹配的參數(shù)(類型、數(shù)量、順序都一致)

那么形參與實(shí)參的關(guān)系又是怎樣的呢?
- 形參變量隸屬于方法體,也就是說它們是方法的局部變量,只有在被調(diào)用的時(shí)候才被創(chuàng)建,才被臨時(shí)性分配內(nèi)存,在調(diào)用結(jié)束后,立即釋放所分配的內(nèi)存單元。也就是說,當(dāng)方法調(diào)用返回后,就不能再使用這些參數(shù)了。
- 在調(diào)用方法時(shí),實(shí)參和形參在數(shù)量上、類型上、順序上應(yīng)嚴(yán)格保證一一對(duì)應(yīng)的關(guān)系,否則就會(huì)出現(xiàn)參數(shù)類型不匹配的錯(cuò)誤,從而導(dǎo)致調(diào)用方法失敗。如下:

二、方法的重載
1.重載的概念
【概念】
方法重載是指在一個(gè)類中定義多個(gè)同名的方法,但要求每個(gè)方法具有不同的參數(shù)的類型或參數(shù)的個(gè)數(shù)。調(diào)用重載方法時(shí),Java編譯器能通過檢查調(diào)用的方法的參數(shù)類型和個(gè)數(shù)選擇一個(gè)恰當(dāng)?shù)姆椒ā?/p>
2.例題分析
認(rèn)真看下面例子中的add方法
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;
}

【總結(jié)】
方法的名字都叫 add. 但是有的 add 是計(jì)算 int 相加, 有的是 double 相加; 有的計(jì)算兩個(gè)數(shù)字相加, 有的是計(jì)算三個(gè)數(shù)
字相加.
同一個(gè)方法名字, 提供不同版本的實(shí)現(xiàn), 稱為 方法重載
【注意】
一.方法名一定要相同。
二.方法的參數(shù)表必須不同,包括參數(shù)的類型或個(gè)數(shù),以此區(qū)分不同的方法體。
1.如果參數(shù)個(gè)數(shù)不同,就不管它的參數(shù)類型了!
2.如果參數(shù)個(gè)數(shù)相同,那么參數(shù)的類型必須不同。
三.方法的返回類型、修飾符可以相同,也可不同。
data = pd.read_csv(
'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())
三、方法的遞歸
1.遞歸定義
簡(jiǎn)單來說,遞歸算是套娃。
從前有座山,山里有座廟,廟里有個(gè)老和尚,老和尚正在給小和尚講故事:從前有座山,山里有座廟,廟里有個(gè)老和尚,老和尚正在給小和尚講故事:…
除非老和尚不講了,否則這個(gè)故事就一直套娃下去。
遞歸,就是在運(yùn)行的過程中調(diào)用自己。
構(gòu)成遞歸需具備的條件:
- 子問題須與原始問題為同樣的事,且更為簡(jiǎn)單;
- 不能無限制地調(diào)用本身,須有個(gè)出口,化簡(jiǎn)為非遞歸狀況處理。
2.例題分析
舉個(gè)例子:遞歸求 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("函數(shù)開始, n = " + n);
if (n == 1) {
System.out.println("函數(shù)結(jié)束, n = 1 ret = 1");
return 1;
}else{
int ret = n * factor(n - 1);
System.out.println("函數(shù)結(jié)束, n = " + n + " ret = " + ret);
return ret;
}
}
分析遞歸過程如下:



3.遞歸應(yīng)用場(chǎng)景
遞歸算法一般用于解決三類問題:
- 數(shù)據(jù)的定義是按遞歸定義的。(Fibonacci函數(shù))
- 問題解法按遞歸算法實(shí)現(xiàn)。這類問題雖則本身沒有明顯的遞歸結(jié)構(gòu),但用遞歸求解比迭代求解更簡(jiǎn)單,如Hanoi問題。
- 數(shù)據(jù)的結(jié)構(gòu)形式是按遞歸定義的。如二叉樹、廣義表等,由于結(jié)構(gòu)本身固有的遞歸特性,則它們的操作可遞歸地描述。
【注意】
雖然遞歸操作有很多的優(yōu)點(diǎn),但是缺點(diǎn)也很明顯
- 使用遞歸實(shí)現(xiàn)需要函數(shù)壓棧和彈棧的操作,所以程序的運(yùn)行速度比不用遞歸實(shí)現(xiàn)要慢得多。如果操作不慎,還極易出現(xiàn)死循環(huán),所以在使用遞歸一定要設(shè)置遞歸操作的終止條件。
下面給大家推薦遞歸的兩個(gè)經(jīng)典例題:
- 求斐波那契數(shù)列的第 N 項(xiàng)
- 求解漢諾塔問題(提示, 使用遞歸)
- 青蛙跳臺(tái)階問題(提示, 使用遞歸)
有興趣的同學(xué)可以去自行嘗試!
總結(jié)
最近在看《士兵突擊》,迷惘了,希望能夠找點(diǎn)東西激勵(lì)自己?!妒勘粨簟吩谀撤N程度上,真的讓我感悟良多。推薦大家去看看。
里面的臺(tái)詞讓我受益良多。
“心穩(wěn)了,手也就穩(wěn)了”
“想到和得到之間還有兩個(gè)字,就是做到”
各位,共勉了!
到此這篇關(guān)于Java程序中方法的用法重載和遞歸的文章就介紹到這了,更多相關(guān)Java 方法 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot使用Mybatis(xml和注解)過程全解析
這篇文章主要介紹了springboot使用Mybatis(xml和注解)過程全解析 ,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-05-05
Java使用POI解析帶圖片的excel文件(簡(jiǎn)潔好用!)
這篇文章主要給大家介紹了關(guān)于Java如何使用POI解析帶圖片的excel文件的相關(guān)資料,最近項(xiàng)目需要讀取excel中的信息,帶圖片,所以這里給大家總結(jié)下,需要的朋友可以參考下2023-08-08
Spring-cloud Config Server的3種配置方式
這篇文章主要介紹了Spring-cloud Config Server的3種配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
SpringBoot2+Netty+WebSocket(netty實(shí)現(xiàn)websocket支持URL參數(shù))問題記錄
Netty?是一個(gè)利用?Java?的高級(jí)網(wǎng)絡(luò)的能力,隱藏其背后的復(fù)雜性而提供一個(gè)易于使用的?API?的客戶端/服務(wù)器框架,這篇文章主要介紹了SpringBoot2+Netty+WebSocket(netty實(shí)現(xiàn)websocket,支持URL參數(shù)),需要的朋友可以參考下2023-12-12
spring-data-jpa實(shí)現(xiàn)增刪改查以及分頁操作方法
下面小編就為大家分享一篇spring-data-jpa實(shí)現(xiàn)增刪改查以及分頁操作方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-02-02
一分鐘掌握J(rèn)ava?Quartz定時(shí)任務(wù)
這篇文章主要為大家介紹了Java?Quartz定時(shí)任務(wù)一分鐘掌握教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
Spring實(shí)現(xiàn)聲明式事務(wù)的方法詳解
這篇文章主要介紹了Spring實(shí)現(xiàn)聲明式事務(wù)的方法詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01

