方法的基本用法
方法定義
方法就是一個功能
方法就是一個代碼片段,類似于 C 語言中的 “函數”
基本語法格式:
1
2
3
4
5
|
//方法定義 修飾符 返回值類型 方法名稱([形式參數列表 ...]){ 方法體; [ return 返回值]; } |
注意事項:
在現階段,方法的修飾暫時采用—> public static 固定搭配[ ]內部的表示可有可無方法必須定義在類中方法名要采用小駝峰的形式Java中的返回值可有可無,看業務需求,若有返回值,返回值類型需要和方法的返回值類型匹配行書參數列表:形參,是實參的一份拷貝方法體:具體功能的實現
為什么方法一般用public static修飾?
因為當前所有方法寫完之后,若調用,都會在main方法中調用,而main方法是public static的
代碼示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public class DemoOne { // 實現一個兩個整數相加的方法 public static int add( int x, int y){ return x+y; } public static void main(String[] args) { int a = 212 ; int b = 454 ; //方法調用 int ret = add(a,b); System.out.println(ret); } } |
注意事項:
- 方法定義時,參數可以沒有,若有參數,每個參數要指定類型
- 方法定義時,返回值也可以沒有,比如main方法,如果沒有返回值,則返回值類型必須寫成 void
- 方法定義不能嵌套
- Java 中沒有 “函數聲明” 這個概念
- 方法必須定義在類之中,方法定義的位置在調用位置的上方或者下方均可
方法調用的調試過程
一個程序猿最厲害的不在于能寫出多牛X的代碼,而是能夠解決代碼的問題!!
IDEA 的調試過程:
打斷點
開始調試,點擊"甲殼蟲"
點擊后,會出現下邊這個框
注意事項:
- 參數傳遞完畢后,就會執行到方法代碼體
- 定義方法的時候, 不會執行方法的代碼. 只有調用的時候才會執行
- 一個方法可以被多次調用
- (遇到 return ) 方法執行完畢后,回到方法調用位置繼續執行
- 當方法被調用時,會將實參賦值給形參
- Java中只有按值傳遞
暫停調試
方法的重復調用:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
//求三個數的最大值 public static int maxThreeNum( int num1, int num2, int num3){ return maxNum(maxNum(num1,num2),num3); //方法的重復調用 } //兩個數的最大值 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); } |
實參和形參的關系
形參只是方法在定義時需要借助的一個變量,用來保存方法在調用時傳遞過來的值
代碼示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
交換兩個整型變量 public static void swap( int x, int y){ int tmp = x; x = y; y = tmp; } public static void main(String[] args) { //交換兩個整數 int a = 10 ; int b = 20 ; swap(a,b); System.out.println(a + " " + b); } |
運行后會發現,這個方法不能實現交換兩個整型變量的功能
可用類和對象 / 數組 來實現,后邊會講到
原因分析:
方法里交換的是形參 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產生任何影響。
解決方法:
這里不過多解釋,之后寫數組章節再作解釋
1
2
3
4
5
6
7
8
9
10
|
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; } |
結論:
- 在Java中,實參的值永遠都是拷貝到形參中,形參和實參本質是兩個實體
- 對于基礎類型來說,形參相當于實參的拷貝,即:傳值調用
方法的重載 (Overload)
什么是方法重載?
舉例:
在方法sumInt中,若要求兩小數之和,就不能實現,必須再寫一個sumDouble方法,這樣使用很不靈活
1
2
3
4
5
6
7
8
|
兩整數之和 public static int sumInt( int x, int y){ return x+y; } 兩小數之和 public static double sumDouble( double x, double y){ return x+y; } |
解決方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
方法 1 兩整數之和 public static int sum( int x, int y){ return x+y; } 方法 2 兩小數之和 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 的關系就是重載
構成重載的 3 個條件:
- 方法名必須相同
- 返回值可以不同
- 參數列表必須不同(參數的個數不同 / 參數的類型不同)
- (注意事項) 同一個類當中
重載和重寫的區別是什么?
方法的重載和重寫都是實現多態的方式,區別:重載實現的是編譯時的多態性,而重寫實現的是運行時的多態性
①.重載發生在一個類中,同名的方法如果有不同的參數列表(參數類型不同 / 參數個數不同)則視為重載
②.重寫發生在子類與父類之間,重寫要求子類被重寫方法與父類被重寫方法有相同的參數列表,有兼容的返回類型,比父類被重寫方法更好訪問,不能比父類被重寫方法聲明更多的異常。
重載對返回類型沒有特殊的要求,不能根據返回類型進行區分。
方法的遞歸
什么是遞歸?
一個方法在執行過程中對自身的調用,稱為"遞歸"
- 方法要調用自己本身
- 要有一個趨近于終止的條件
- 想辦法推導出"遞歸"的公式
遞歸代碼示例:
求n的階乘:
1
2
3
4
5
6
|
public static int factor( int n){ if (n == 1 ){ return 1 ; } return n * factor(n- 1 ); } |
代碼過程分析:
遞歸的理解
"遞" "歸"理解:
棧的角度理解:
方法的調用是要在棧上開辟內存的,給這個方法開辟棧幀
思考遞歸,要橫向思考,不要試圖去走進遞歸的代碼,代碼執行,是縱向執行
總結
本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關注服務器之家的更多內容!
原文鏈接:https://blog.csdn.net/m0_47988201/article/details/119645025