Java由淺入深全面講解方法的使用
一、方法的概念及其使用
1.1、什么是方法
方法就是一個(gè)代碼片段. 類似于 C 語言中的 “函數(shù)”。作用如下:
1. 是能夠模塊化的組織代碼(當(dāng)代碼規(guī)模比較復(fù)雜的時(shí)候).
2. 做到代碼被重復(fù)使用, 一份代碼可以在多個(gè)位置使用.
3. 讓代碼更好理解更簡(jiǎn)單.
4. 直接調(diào)用現(xiàn)有方法開發(fā), 不必重復(fù)造輪子.
1.2、方法的定義
定義格式:
示例:寫函數(shù)實(shí)現(xiàn)求多少項(xiàng)的階乘的和
public class TeseDemo220424 { // 計(jì)算某一個(gè)數(shù)的階乘 public static int func(int n){ int ret = 1; for(int i = 1;i <= n;i++){ ret *= i; } return ret; } // 計(jì)算前多少項(xiàng)階乘之和 public static int func1(int k){ int sum = 0; for(int i = 1;i <= k;i++){ sum += func(i); } return sum; } public static void main(String[] args) { // 寫函數(shù)來求階乘之和 Scanner myscanner = new Scanner(System.in); System.out.println("請(qǐng)輸入你想要求取前多少項(xiàng)的階乘的和:"); int num = myscanner.nextInt(); int sum = func1(num); System.out.println("前 " + num + "項(xiàng)的階乘和為" + sum); } }
注意:
1. 修飾符:現(xiàn)階段直接使用public static 固定搭配(因?yàn)閙ain方法是public static ,所以在里面調(diào)用的也只能是靜態(tài)的方法)。
2. 返回值類型:如果方法有返回值,返回值類型必須要與返回的實(shí)體類型一致,如果沒有返回值,必須寫成void。
3. 方法名字:采用小駝峰命名。
4. 參數(shù)列表:如果方法沒有參數(shù),()中什么都不寫,如果有參數(shù),需指定參數(shù)類型,多個(gè)參數(shù)之間使用逗號(hào)隔開。
5. 方法體:方法內(nèi)部要執(zhí)行的語句。
6. 在java當(dāng)中,方法必須寫在類當(dāng)中。
7. 在java當(dāng)中,方法不能嵌套定義。
8. 在java當(dāng)中,沒有方法聲明一說。(聲明與定義不區(qū)分)
1.3、方法調(diào)用的執(zhí)行過程
調(diào)用過程:
調(diào)用方法—>傳遞參數(shù)—>找到方法地址—>執(zhí)行被調(diào)方法的方法體—>被調(diào)方法結(jié)束返回—>回到主調(diào)方法繼續(xù)往下執(zhí)行
形象圖示:
注意:
1,定義方法的時(shí)候, 不會(huì)執(zhí)行方法的代碼. 只有調(diào)用的時(shí)候才會(huì)執(zhí)行.
2,一個(gè)方法可以被多次調(diào)用.
1.4、實(shí)參和形參的關(guān)系(重要)
對(duì)于形參與實(shí)參的關(guān)系,大家肯定不陌生,那就是形參是實(shí)參的一份臨時(shí)拷貝,也就是說形參的改變不會(huì)影響到實(shí)參。
具體原因圖示:(因?yàn)榫唧w涉及到函數(shù)棧幀的問題比較復(fù)雜,這里就給大家簡(jiǎn)略的解釋下)
所以,由圖可以知道,傳值調(diào)用的話,形參與實(shí)參的值根本就不是存儲(chǔ)在同一個(gè)空間,所以而這不會(huì)相互干擾,在C語言中,如果你希望形參的改變能夠影響到實(shí)參,那就必須是傳址調(diào)用,但是在Java里面沒有傳址這種說法,解決方法只能是利用引用(具體后面會(huì)詳細(xì)介紹)。
二、方法的重載
2.1、為什么需要方法重載
public class TestDemo220426 { public static int addInt(int x,int y){ return x + y; } public static double addDouble(double x,double y){ return x + y; } public static void main(String[] args) { int a = 10; int b = 10; int ret = addInt(a,b); double c = 11.1; double d = 12.1; double ret1 = addDouble(c,d); } }
看這段代碼,addint,adddouble這兩個(gè)方法,目的都是為了求兩個(gè)數(shù)的和,但是你得定義兩個(gè)不同的函數(shù),函數(shù)名不同,但往往有時(shí)候取名字又是一件頭疼的事,所以既然方法的本質(zhì)功能都是一樣的,只是可能參數(shù)不同,那我們能不能都用同一個(gè)函數(shù)名呢?
答案是肯定的,而這種就叫做方法的重載。
2.2、方法重載的定義
在Java中,如果多個(gè)方法的名字相同,參數(shù)列表不同,則稱該幾種方法被重載了。也就是一個(gè)名字但卻有不同的涵義。
public class TestDemo220426 { public static int add(int x,int y){ return x + y; } public static double add(double x,double y){ return x + y; } public static void main(String[] args) { int a = 10; int b = 10; int ret = add(a,b); System.out.println(ret); double c = 11.1; double d = 12.1; double ret1 = add(c,d); System.out.println(ret1); } }
程序運(yùn)行截圖:
由上面的程序可以看出,都是實(shí)現(xiàn)相加的功能,但是定義的是兩個(gè)不同的函數(shù)實(shí)現(xiàn),只是函數(shù)名一樣,這就是函數(shù)重載。編譯器會(huì)根據(jù)你傳入的參數(shù)的不同去調(diào)用相應(yīng)的函數(shù)。
注意:
1. 方法名必須相同。
2. 參數(shù)列表必須不同(參數(shù)的個(gè)數(shù)不同、參數(shù)的類型不同、類型的次序必須不同)(需要以參數(shù)來區(qū)分)
3. 與返回值類型是否相同無關(guān)
4. 不能定義僅僅以返回值區(qū)分的兩個(gè)函數(shù),這樣不能構(gòu)成重載
5. 編譯器在編譯代碼時(shí),會(huì)對(duì)實(shí)參類型進(jìn)行推演,根據(jù)推演的結(jié)果來確定調(diào)用哪個(gè)方法
2.3、方法簽名
方法簽名即:經(jīng)過編譯器編譯修改過之后方法最終的名字。具體方式:方法全路徑名+參數(shù)列表+返回值類型,構(gòu)成方法完整的名字。用來區(qū)分重載的函數(shù)
如何可以查看到我們的方法簽名:
1. 先對(duì)工程進(jìn)行編譯生成.class字節(jié)碼文件
2. 在控制臺(tái)中進(jìn)入到要查看的.class所在的目錄
3. 輸入:javap -v 字節(jié)碼文件名字即可
三、遞歸
3.1、遞歸的概念
定義:一個(gè)方法在執(zhí)行過程中調(diào)用自身, 就稱為 "遞歸。
遞歸的必要條件:
1. 遞歸的公式。
2. 遞歸的終止條件。
3.2、遞歸過程分析
public static int func(int num){ if(num == 1){ return 1; } return num*func(num - 1); } public static void main(String[] args) { // 遞歸求階乘 Scanner scan = new Scanner(System.in); System.out.println("請(qǐng)輸入一個(gè)數(shù):"); int num = scan.nextInt(); int ret = func(num); System.out.println("階乘為:" + ret); } }
在這里我們以求一個(gè)數(shù)的階乘的代碼為例來分析一個(gè)遞歸的過程:
遞歸的過程其實(shí)不復(fù)雜,看成兩個(gè)部分,一個(gè)是遞出去,而是歸回來,上面的藍(lán)色箭頭是遞的過程,紅色箭頭是歸的過程。
3.3、遞歸小練習(xí)
- 按順序打印一個(gè)數(shù)字的每一位(例如 1234 打印出 1 2 3 4)
public class TestDemo220427 { public static void myprint(int num){ if(num < 10){ System.out.println(num%10); return; } myprint(num/10); System.out.println(num%10); return; } public static void main(String[] args) { // 遞歸實(shí)現(xiàn)按順序打印數(shù)字的每一位 Scanner scan = new Scanner(System.in); System.out.println("請(qǐng)輸入一個(gè)數(shù):"); int num = scan.nextInt(); myprint(num); } }
- 求斐波那契數(shù)列的第 N 項(xiàng)
public class TestDemo220428 { public static int fib1(int n){ int f1 = 1; int f2 = 1; int f3 = 1; for(int i = 3;i <= n;i++){ f3 = f1 + f2; f1 = f2; f2 = f3; } return f3; } public static int fib(int n){ if(n == 1 || n == 2){ return 1; } return fib(n-1) + fib(n-2); } public static void main(String[] args) { // 遞歸求斐波那契數(shù)列的第n項(xiàng) Scanner scan = new Scanner(System.in); System.out.println("請(qǐng)輸入您想要求取的項(xiàng)數(shù):"); int n = scan.nextInt(); int ret = fib1(n); System.out.println("第" + n + "項(xiàng)為:" + ret); } }
利用遞歸求斐波那契數(shù)列的第n項(xiàng)的話,其實(shí)是一個(gè)雙路遞歸,不推薦這種求解的方法,因?yàn)闀?huì)算很多重復(fù)的項(xiàng),效率很低,一般都是選擇循環(huán)迭代的方式來生成斐波那契數(shù)即可。
到此這篇關(guān)于Java由淺入深全面講解方法的使用的文章就介紹到這了,更多相關(guān)Java方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mybatis注解如何實(shí)現(xiàn)對(duì)象批量更改
這篇文章主要介紹了mybatis注解實(shí)現(xiàn)對(duì)象批量更改的方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07Java中dubbo+zookeeper微服務(wù)架構(gòu)簡(jiǎn)介
Apache Dubbo是一款高性能的 Java RPC 框架,這篇文章主要介紹了Java中dubbo+zookeeper微服務(wù)架構(gòu),需要的朋友可以參考下2021-09-09java使用poi讀取excel內(nèi)容方法實(shí)例
本文介紹java使用poi讀取excel內(nèi)容的實(shí)例,大家參考使用吧2014-01-01request如何獲取body的json數(shù)據(jù)
這篇文章主要介紹了request如何獲取body的json數(shù)據(jù)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06解析mybatis-plus中的resultMap簡(jiǎn)單使用
mybatis-plus也只是聽過,可是終究沒有使用過。于是自己花幾天晚上的時(shí)間研究mybatis-plus的使用。這篇文章主要介紹了mybatis-plus的resultMap簡(jiǎn)單使用,需要的朋友可以參考下2021-11-11java HttpURLConnection 發(fā)送文件和字符串信息
這篇文章主要介紹了java HttpURLConnection 發(fā)送文件和字符串信息的相關(guān)資料,需要的朋友可以參考下2017-06-06spring boot之SpringApplication 事件監(jiān)聽
這篇文章主要介紹了spring boot之SpringApplication 事件監(jiān)聽,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-03-03Java如何優(yōu)雅的實(shí)現(xiàn)微信登錄注冊(cè)
這篇文章主要給大家介紹了關(guān)于Java如何優(yōu)雅的實(shí)現(xiàn)微信登錄注冊(cè)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-02-02Jmeter?BeanShell?內(nèi)置變量vars、props、prev的使用詳解
這篇文章主要介紹了Jmeter?BeanShell?內(nèi)置變量vars、props、prev的使用?,文中給大家介紹了Jmeter中關(guān)于BeanShell的相關(guān)知識(shí),結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-10-10Java 常見的限流算法詳細(xì)分析并實(shí)現(xiàn)
大數(shù)據(jù)量高并發(fā)訪問時(shí),經(jīng)常出現(xiàn)服務(wù)或接口面對(duì)暴漲的請(qǐng)求而不可用的情況,甚至引發(fā)連鎖反映導(dǎo)致整個(gè)系統(tǒng)崩潰。此時(shí)你需要使用的技術(shù)手段之一就是限流,當(dāng)請(qǐng)求達(dá)到一定的并發(fā)數(shù)或速率,就進(jìn)行等待、排隊(duì)、降級(jí)、拒絕服務(wù)等。限流時(shí),常見算法是計(jì)數(shù)器、漏斗、令牌桶算法2022-04-04