一篇文章帶你了解Java方法的使用
方法的基本用法
方法定義
方法就是一個(gè)功能
方法就是一個(gè)代碼片段,類似于 C 語(yǔ)言中的 “函數(shù)”
基本語(yǔ)法格式:
//方法定義 修飾符 返回值類型 方法名稱([形式參數(shù)列表 ...]){ 方法體; [return 返回值]; }
注意事項(xiàng):
在現(xiàn)階段,方法的修飾暫時(shí)采用—> public static 固定搭配[ ]內(nèi)部的表示可有可無(wú)方法必須定義在類中方法名要采用小駝峰的形式Java中的返回值可有可無(wú),看業(yè)務(wù)需求,若有返回值,返回值類型需要和方法的返回值類型匹配行書參數(shù)列表:形參,是實(shí)參的一份拷貝方法體:具體功能的實(shí)現(xiàn)
為什么方法一般用public static修飾?
因?yàn)楫?dāng)前所有方法寫完之后,若調(diào)用,都會(huì)在main方法中調(diào)用,而main方法是public static的
代碼示例:
public class DemoOne { // 實(shí)現(xiàn)一個(gè)兩個(gè)整數(shù)相加的方法 public static int add(int x,int y){ return x+y; } public static void main(String[] args) { int a = 212; int b = 454; //方法調(diào)用 int ret = add(a,b); System.out.println(ret); } }
注意事項(xiàng):
- 方法定義時(shí),參數(shù)可以沒(méi)有,若有參數(shù),每個(gè)參數(shù)要指定類型
- 方法定義時(shí),返回值也可以沒(méi)有,比如main方法,如果沒(méi)有返回值,則返回值類型必須寫成 void
- 方法定義不能嵌套
- Java 中沒(méi)有 “函數(shù)聲明” 這個(gè)概念
- 方法必須定義在類之中,方法定義的位置在調(diào)用位置的上方或者下方均可
方法調(diào)用的調(diào)試過(guò)程
一個(gè)程序猿最厲害的不在于能寫出多牛X的代碼,而是能夠解決代碼的問(wèn)題??!
IDEA 的調(diào)試過(guò)程:
打斷點(diǎn)
開始調(diào)試,點(diǎn)擊"甲殼蟲"
點(diǎn)擊后,會(huì)出現(xiàn)下邊這個(gè)框
注意事項(xiàng):
- 參數(shù)傳遞完畢后,就會(huì)執(zhí)行到方法代碼體
- 定義方法的時(shí)候, 不會(huì)執(zhí)行方法的代碼. 只有調(diào)用的時(shí)候才會(huì)執(zhí)行
- 一個(gè)方法可以被多次調(diào)用
- (遇到 return ) 方法執(zhí)行完畢后,回到方法調(diào)用位置繼續(xù)執(zhí)行
- 當(dāng)方法被調(diào)用時(shí),會(huì)將實(shí)參賦值給形參
- Java中只有按值傳遞
暫停調(diào)試
方法的重復(fù)調(diào)用:
//求三個(gè)數(shù)的最大值 public static int maxThreeNum(int num1,int num2,int num3){ return maxNum(maxNum(num1,num2),num3); //方法的重復(fù)調(diào)用 } //兩個(gè)數(shù)的最大值 public static int maxNum(int x,int y){ return x>y ? x : y; } public static void main(String[] args) { Scanner scan = new Scanner(System.in); int num1 = scan.nextInt(); int num2 = scan.nextInt(); int num3 = scan.nextInt(); int max = maxThreeNum(num1,num2,num3); System.out.println("max="+max); }
🔺實(shí)參和形參的關(guān)系
形參只是方法在定義時(shí)需要借助的一個(gè)變量,用來(lái)保存方法在調(diào)用時(shí)傳遞過(guò)來(lái)的值
代碼示例:
交換兩個(gè)整型變量 public static void swap(int x,int y){ int tmp = x; x = y; y = tmp; } public static void main(String[] args) { //交換兩個(gè)整數(shù) int a = 10; int b = 20; swap(a,b); System.out.println(a + " " + b); }
運(yùn)行后會(huì)發(fā)現(xiàn),這個(gè)方法不能實(shí)現(xiàn)交換兩個(gè)整型變量的功能
可用類和對(duì)象 / 數(shù)組 來(lái)實(shí)現(xiàn),后邊會(huì)講到
原因分析:
方法里交換的是形參 x 和 y 的值,而main方法中打印的是實(shí)參 a 和 b 的值
實(shí)參a和b是main方法中的兩個(gè)變量,其空間在main方法的棧(一塊特殊的內(nèi)存空間)中,而形參x和y是swap方法中的兩個(gè)變量,x和y的空間在swap方法運(yùn)行時(shí)的棧中,因此:實(shí)參a和b 與 形參x和y是兩個(gè)沒(méi)有任何關(guān)聯(lián)性的變量,在swap方法調(diào)用時(shí),只是將實(shí)參a和b中的值拷貝了一份傳遞給了形參x和y,因此對(duì)形參x和y操作不會(huì)對(duì)實(shí)參a和b產(chǎn)生任何影響。
解決方法:
這里不過(guò)多解釋,之后寫數(shù)組章節(jié)再作解釋
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; }
結(jié)論:
- 在Java中,實(shí)參的值永遠(yuǎn)都是拷貝到形參中,形參和實(shí)參本質(zhì)是兩個(gè)實(shí)體
- 對(duì)于基礎(chǔ)類型來(lái)說(shuō),形參相當(dāng)于實(shí)參的拷貝,即:傳值調(diào)用
方法的重載 (Overload)
什么是方法重載?
舉例:
在方法sumInt中,若要求兩小數(shù)之和,就不能實(shí)現(xiàn),必須再寫一個(gè)sumDouble方法,這樣使用很不靈活
兩整數(shù)之和 public static int sumInt(int x,int y){ return x+y; } 兩小數(shù)之和 public static double sumDouble(double x,double y){ return x+y; }
解決方法:
方法1 兩整數(shù)之和 public static int sum(int x,int y){ return x+y; } 方法2 兩小數(shù)之和 public static double sum(double x,double y){ return x+y; } public static void main(String[] args) { double a = 19.9; double b = 18.8; double ret = sum(a,b); //直接使用 sum System.out.println(ret); }
上述方法1 和方法2 的關(guān)系就是重載
構(gòu)成重載的 3 個(gè)條件:
- 方法名必須相同
- 返回值可以不同
- 參數(shù)列表必須不同(參數(shù)的個(gè)數(shù)不同 / 參數(shù)的類型不同)
- (注意事項(xiàng)) 同一個(gè)類當(dāng)中
🔺重載和重寫的區(qū)別是什么?
方法的重載和重寫都是實(shí)現(xiàn)多態(tài)的方式,區(qū)別:重載實(shí)現(xiàn)的是編譯時(shí)的多態(tài)性,而重寫實(shí)現(xiàn)的是運(yùn)行時(shí)的多態(tài)性
①.重載發(fā)生在一個(gè)類中,同名的方法如果有不同的參數(shù)列表(參數(shù)類型不同 / 參數(shù)個(gè)數(shù)不同)則視為重載
②.重寫發(fā)生在子類與父類之間,重寫要求子類被重寫方法與父類被重寫方法有相同的參數(shù)列表,有兼容的返回類型,比父類被重寫方法更好訪問(wèn),不能比父類被重寫方法聲明更多的異常。
重載對(duì)返回類型沒(méi)有特殊的要求,不能根據(jù)返回類型進(jìn)行區(qū)分。
方法的遞歸
什么是遞歸?
一個(gè)方法在執(zhí)行過(guò)程中對(duì)自身的調(diào)用,稱為"遞歸"
- 方法要調(diào)用自己本身
- 要有一個(gè)趨近于終止的條件
- 想辦法推導(dǎo)出"遞歸"的公式
遞歸代碼示例:
求n的階乘:
public static int factor(int n){ if(n == 1){ return 1; } return n * factor(n-1); }
代碼過(guò)程分析:
遞歸的理解
"遞" "歸"理解:
棧的角度理解:
方法的調(diào)用是要在棧上開辟內(nèi)存的,給這個(gè)方法開辟棧幀
思考遞歸,要橫向思考,不要試圖去走進(jìn)遞歸的代碼,代碼執(zhí)行,是縱向執(zhí)行
總結(jié)
本篇文章就到這里了,希望能給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
通過(guò)Java實(shí)現(xiàn)bash命令過(guò)程解析
這篇文章主要介紹了通過(guò)Java實(shí)現(xiàn)bash命令過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01Spring AOP實(shí)現(xiàn)復(fù)雜的日志記錄操作(自定義注解)
Spring AOP實(shí)現(xiàn)復(fù)雜的日志記錄操作(自定義注解),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09Mybatis實(shí)現(xiàn)ResultMap結(jié)果集
本文主要介紹了Mybatis實(shí)現(xiàn)ResultMap結(jié)果集,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04Spring Boot mybatis-config 和 log4j 輸出sql 日志的方式
這篇文章主要介紹了Spring Boot mybatis-config 和 log4j 輸出sql 日志的方式,本文通過(guò)實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-07-07Java導(dǎo)出oracle表結(jié)構(gòu)實(shí)例詳解
這篇文章主要介紹了 Java導(dǎo)出oracle表結(jié)構(gòu)實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-03-03