今天是學習計劃的第三天,也是3月30日——筆者的生日!🎉 繼前兩天的基礎語法後,今天我們來聊聊 Java 中的「方法」。
很多有 C 語言基礎的同學會發現:Java 的方法長得跟 C 的函數一模一樣。確實,從語法結構上看,兩者極其相似。但地位上卻有天壤之別:
類名.方法名() 調用(靜態方法)對象.方法名() 調用(實例方法)⚠️ 重點:方法永遠只能被類或對象調用,絕不能獨立執行!
疑問:同一個類裡,方法 A 直接呼叫方法 B,沒寫 this. 或類名,為什麼能跑通?
答案:編譯器會自動補齊——實例方法補 this.,靜態方法補 類名.。
Java 方法參數傳遞機制只有一種:值傳遞(Call by Value)。
通俗說:實參的值被複製一份傳給形參,方法內操作的是副本,原實參不受影響。
public static void changenum(int num1, int num2) {
int temp = num1; num1 = num2; num2 = temp;
System.out.println("方法內:num1=" + num1 + ";num2=" + num2);
}
public static void main(String[] args) {
int num1 = 1, num2 = 2;
changenum(num1, num2);
System.out.println("main內:num1=" + num1 + ";num2=" + num2); // 仍為 1、2
}
結果證明:方法內交換的是副本,main 內原變數毫髮無傷。
若 changenum 去掉 static,main 直接呼叫會報錯:
non-static method changenum(int,int) cannot be referenced from a static context
修正方式:Main test = new Main(); test.changenum(num1, num2); —— 再次驗證「非靜態方法屬於對象,必須通過對象調用」。
public static void changenum(Main test) {
int temp = test.num1; test.num1 = test.num2; test.num2 = temp;
}
這回 main 內的值也變了!原因:傳的是引用變量的副本(地址值),兩個引用指向同一個堆內存對象,操作的是同一塊內存。
結論:依然是值傳遞,傳的是「引用的值」。
不確定參數個數時,在最後一個參數類型後加 ...:
public static void meetingpeople(int num, String... name) {
System.out.print(num);
for (String temp : name) System.out.print(temp);
}
meetingpeople(3, "小張", "小李", "小王"); // 輸出 3小張小李小王
同一類中允許同名方法,只要參數列表不同(個數、類型、順序任一不同即可),返回值類型無關。調用時由編譯器根據實參匹配。
public static void fangfa() { ... }
public static void fangfa(String say) { ... }
public static void fangfa(int num) { ... }