哈嘍,大家好!我是白夜,今天給大家聊聊Java裡面的方法。
一、什麼是方法
1.1、方法的概念與作用
1.1.1、概念
方法(method),又稱為函式(function),代表一段“獨立的”“可複用”的“功能”程式碼
1.1.2、作用
方法可以複用程式碼,減少了程式碼的冗餘,提高效率和程式的可讀性。
1.2、方法的定義
定義一個方法的語法
/**
* 修飾符 返回值型別 方法名稱([引數型別 形參 ...]){
* 方法體程式碼;
* (return 返回值;)
* }
*/
public static void main(String[] args) {
int num1 = 10;
int num2 = 20;
System.out,println(Add(a,b));
}
- 修飾符:修飾符,這是可選的,告訴編譯器如何呼叫該方法。定義了該方法的訪問型別。
- 返回值型別∶方法可能會返回值。returnValueType 是方法返回值的資料型別。有些方法執行所需的操作,但沒有返回值。在這種情況下,returnValueType 是關鍵字 void。
- 方法名:是方法的實際名稱,採用小駝峰命名。方法名和參數列共同構成方法簽名。
- 引數型別:引數像是一個佔位符。當方法被呼叫時,傳遞值給引數。這個值被稱為實參或變數。引數列表是指方法的引數型別、順序和引數的個數。引數是可選的,方法可以不包含任何引數。
- 形式引數:在方法被呼叫時用於接收外界輸入的資料。
- 實參:呼叫方法時實際傳給方法的資料。
注意事項:
- 修飾符:現階段直接使用 static 固定搭配,static 表示靜態的,後面根據具體使用場景是否用static 修飾
- 引數列表:如果方法沒有引數,()中什麼都不寫,如果有引數,需指定引數型別,多個引數之間使用逗號隔開
定義方法時一般有以下幾種情況:
- 無引數無返回值的
- 無引數有返回值的
- 有引數無返回值的
- 有引數有返回值的
//無引數無返回值
public void m1() { }
//無引數有返回值
public int m2() {
return 1;
}
//有引數無返回值
public void m3(String s) { }
//有引數有返回值
public boolean m4(int a) {
return true;
}
定義方法時基本上就是以上幾種情況,可以選擇加或者不加訪問許可權修飾符和靜態修飾符,但是返回值型別和方法簽名是必不可少的。
注意:有返回值的方法,必須在方法體中,使用 return 關鍵字,返回對應型別的值。比如你定義的方法返回值是int型別,那麼在大括號中就必須有 return 整數數字; 如果 return 後的資料型別與返回值型別不同,也會報錯。
在 java 中,return 關鍵字和 break 關鍵字的作用相似,在當前這行程式碼使用 return 關鍵字時表示程式碼到此執行結束,下邊的程式碼都不會再執行了。如果寫了就會報錯。
二、方法的呼叫
2.1、語法
主要是看否是靜態方法(被 static 修飾)
靜態方法:在本類中可以直接使用方法名(引數)呼叫,在其他類中使用類名點方法名(引數)呼叫
非靜態方法:在任何地方呼叫,都需要建立類的引用物件,使用引用物件點方法名(引數)呼叫
//靜態方法呼叫 類名+方法名()
User.getName();//無參的
User.getName("毛毛"); //有參的
//非靜態方法呼叫 物件名+方法名()
User u = new User();
u.getName();//無參的
u.getName("毛毛"); //有參的
注意事項:
- 定義方法的時候, 不會執行方法的程式碼. 只有呼叫的時候才會執行。
- 一個方法可以被多次呼叫。
- 一個方法只完成一個功能,方法完成的功能越多,複用性越差
2.2、形參和實參的關係
Java中方法的形參的名字可以隨意取,對方法都沒有任何影響,形參只是方法在定義時需要藉助的一個變數,用來儲存方法在呼叫時傳遞過來的值。
- 形參:方法定義中的引數
- 實參:方法呼叫中的引數
//n1和n2就是形參
public static int add (int n1,int n2) {
return n1 + n2;
}
add(num1,num2);//num1和num2就是實參,在方法被呼叫時,形參n1用來儲存num1的數值,形參n2用來儲存num2的數值
2.3、關鍵字return
return用於結束當前方法的執行。
return的使用有兩種形式:
- return; ==> 只能用於方法的返回值型別是 void 的場景
- return 結果值; ==>只能用於方法的返回值型別不是 void 的場景。
public void max(int[] a){
for(int i = 0; i<int.length i++;){
if(int[i] == a){
//結束方法
return;
}
}
}
public int max(int a, int b){
//返回值
return a > b ? a : b
}
三、方法的過載
3.1、過載(OverLoad)
3.1.1、方法過載的概念和作用
概念:在同一個類中,方法名相同,形參列表不同,就是方法過載。
作用:
- 可以減少命名衝突
- 可以減少程式設計師記憶成本,方便解決了一類問題
3.1.2、語法
//構成過載關係,以為個數不一樣
public static int sum (int a,int b) {
return a + b;
}
public static int sum (int a,int b,int c) {
return a + b + c;
}
//構成過載,因為引數個數不同
public static float func (int a) {
//方法體
}
public static int func (int a,int b) {
//方法體
}
//不構成過載關係,因為引數都一樣,不用管返回值!
public static void func (int a) {
//方法體
}
public static int func (int a) {
//方法體
}
public class Test1 {
public static void func (int a) {
//方法體
}
}
//不構成過載關係,因為分別在兩個類中
public class Test2 {
public static int func (double b) {
//方法體
}
}
3.1.3、注意事項
- 方法名必須相同。
- 引數列表必須不同(引數的個數不同、引數的型別不同、型別的次序必須不同)。
- 與返回值型別是否相同無關。
- 編譯器在編譯程式碼時,會對實參型別進行推演,根據推演的結果來確定呼叫哪個方法。
3.2、方法簽名
概念:
方法簽名,是來區分不同方法的標示符。
語法:
方法名和引數列表
方法名不同或者引數列表不同都可以用來區分不同的方法。
具體方式:方法全路徑名+引數列表+返回值型別,構成方法完整的名字。
四、方法使用的注意事項
- 方法呼叫的時候,實參(變數/值) 必須和 形參完全一致
- 一個類中,只能有一個方法簽名
- 返回值型別是 void,不能用變數接受,不能放在列印語句中
- 返回值不是void,必須return一個資料,並且資料型別和返回值型別完全一致
- return的資料,如果在if或者迴圈語句中,必須保證在條件語句和迴圈語句不成立的情況下,也有資料的返回
五、方法的引數傳遞
java 的引數傳遞:
基本資料型別傳遞的是:值本身。
引用資料型別傳遞的是:變數在堆中的引用地址。
5.1、值傳遞
值傳遞(Pass by Value)是指將引數的副本傳遞給方法,即方法內部對引數進行的操作不會影響到原始的引數
/**
* 堆疊分析:
* 基本型別是"值"的傳遞
* 引用型別是引用地址的傳遞
* 方法內部對引數的修改只會在方法內部生效,不會影響到方法外部
*/
public class _04StackHeap {
public static void main(String[] args) {
int a = 1;
System.out.println("改變前:" + a);// 1
// 呼叫change方法
change(a);
System.out.println("改變後================ :" + a);// 1
}
public static void change(int a) {
a = 2;
System.out.println("改變中-------:" + a);// 2
}
}
5.2、引用傳遞
引用傳遞(Pass by Reference)是指將引數的引用地址值傳遞給方法,即方法內部對引數的操作會影響到原始的引數。
* 堆疊分析:
* 基本型別是"值"的傳遞
* 引用型別是引用地址的傳遞
* 在引用傳遞中,方法內部對引數的修改會直接反映到方法外部
*/
public class _05StackHeap {
public static void main(String[] args) {
int[] arr = {1, 2};
System.out.println("改變前:" + arr[0]);// 1
System.out.println("改變前:" + arr[1]);// 2
// 呼叫change方法
change(arr);
System.out.println("改變後================ :" + arr[0]);// 6
System.out.println("改變後================ :" + arr[1]);// 9
}
public static void change(int[] arr) {
arr[0] = 6;
arr[1] = 9;
System.out.println("改變中-------:" + arr[0]);// 6
System.out.println("改變中-------:" + arr[1]);// 9
}
}
5.3、可變引數
5.3.1、語法
//引數型別... 變數名
public void aa(int a, int... bs){ };
特點:
- 一個方法中只能指定一個可變引數,
- 它必須是方法的最後一個引數,任何普通的引數必須在它之前宣告。
public static int getSum(int... arr) {
System.out.println(arr);// 地址
System.out.println(arr.length);// 陣列長度
int sum = 0;
for (int e : arr) {
System.out.println("元素:" + e);
sum += e;
}
return sum;
}