方法是爲完成一個操作而組合在一起的語句組。比如我們最早接觸的在Java 庫中預定義的方法,例如:System.out.println、System.exit、Math . pow 和 Math .random,接下來我會分享如何定義自己的方法以及應用方法抽象來解決複雜問題。
一、定義方法
1、方法的定義由方法名稱、參數、返回值類型以及方法體組成。
2、定義方法的語法如下所示:
修飾符 返回值類型 方法名( 參數列表 ){
方法體 ;
}
3、名詞解釋:
1)方法頭:是由方法的修飾符、返回值類型、方法名和方法的參數組成。
2)帶返回值的方法:方法有返回值
3) void 方法:方法沒有返回值
4)形式參數:定義在方法頭中的變量就是形式參數,也叫形參。
5)實際參數:當調用方法時,就給參數傳遞一個值,這個值稱爲實際參數,也叫實參。
6)參數列表:指明方法中參數的類型、順序和個數。
7)方法簽名:由方法名和參數列表一起構成。
注:
1)方法可以返回一個值。有些方法只是完成某些要求的操作,而不返回值。在這種情況下其關鍵字 void。例如:在 main 方法中 方法返回值的數據類型 就是 void, 在 System.exit、System.out.println 方法中返回值類型也是如此。
2)參數是可選的,也就是說, 方法可以不包含參數。例如:Math.randomO 方法就沒有參數
3)在其他某些語言中,方法稱爲過程( procedure) 或函數(fimction)。帶返回值的方 法稱爲函數,返回值類型爲 void 的方法稱爲過程。
4)在方法頭中,需要對每一個參數進行獨立的數據類型聲明。例如:sub(int numl,1nt num2)是正確的,而 sub(int numl,mim2)是錯誤的。
5)“定義方法” 和 “聲明變量”的細微差別。定義是指被定義的條目是什麼,而聲明通常是指爲被聲明的條目分配內存來存儲數據。
函數傳參圖示
二、調用方法
1、調用方法就是指執行方法中的代碼。
2、調用方法的途徑:
1)如果方法返回一個值,對方法的調用通常就當作一個值處理。
例如: int z = sub(7, 3); 調用方法sub(7, 3)並將其結果附給變量 z。另一個把它當作值處理的調用例子是:
System.out.println(sub(7, 3)); 這條語句打印調用方法 sub(7, 3)後的返回值。
2)如果方法返回 void, 對方法的調用必須是一條語句。
例如,println 方法返回 void。下面的調用就是一條語句: System.out.println("Weicome to Java!");
注:
(1)在 Java 中,帶返回值的方法也可以當作語句調用。這種情況下,函數調用者只需忽略返回值即可。雖然這種情況很少見,但是,如果調用者對返回值不感興趣,這樣也是允許的。
(2)當程序調用一個方法時,程序控制就轉移到被調用的方法。當執行完 return 語句或執行到表示方法結束的右括號時,被調用的方法將程序控制返還給調用者。對帶返回值的方法而言,return 語句是必需的。
3、方法能夠帶來代碼的共享和重用。除了可以在 TestSub 中調用 sub 方法,還可以在其他類中調用它。如果創建了一個新類,可以通過使用 “類名 .方法名”(即 TestSub .sub ) 來調用 sub方法。
4、方法到底是如何被調用的?
第一種:通過對象名.方法名進行調用,這是最普通的也是最常見的一種調用方式。
第二種:通過new關鍵字調用構造方法,這種是在實例化對象時使用的方式。
第三種:通過類名.方法名調用,當需要調用的那個方法爲靜態(有static的)方法時使用。
注:
1、調用方法時,需要提供實參,它們必須與方法簽名中 所對應的形參次序相同。這稱作參數順序匹配。實參必須與方法簽名中定義的參數在次序和數量上匹配,在類型上兼容。類型兼容 是指不需要經過顯式的類型轉換,實參的值就可以傳遞給形參,例如,將 int 型的實參值傳遞給 double 型形參。
2、形參是方法中具有自己存儲空間的變量。局部變量是在調用方法時分配的,當方法返回到調用者後它就消失了。
三、方法棧
方法的運行是基於棧內存的,棧是一個先進後出的一個容器結構,如子彈按順序123456進棧,按順序出棧654321,可以將每一
個函數理解爲是子彈(函數幀/棧幀),位於棧頂的函數幀優先運行的,主函數絕對是第一個進棧的。
return結束當前函數 -> 當前函數彈棧
方法棧運行流程圖示
模塊化使得代碼易於維護和調試,並且使得代碼可以被重用。 使用方法可以減少冗餘的代碼,提高代碼的複用性。方法也可以用
來模塊化代碼,以提高程序的質量。通過將求最大公約數的代碼封裝在一個方法中,這個程序就具備了以下幾個優點:
1 ) 它將計算最大公約數的問題和 main 方法中的其他代碼分隔開,這樣做會使邏輯更加清晰而且程序的可讀性更強。
2 ) 計箅最大公約數的錯誤就限定在 gcd 方法中,這樣就縮小了調試的範圍。
3 ) 現在,其他程序就可以重複使用gcd方法。
五、重載方法
1、重載方法使得你可以使用同樣的名字來定義不同方法,只要它們的簽名不同即可,java編譯器根據方法簽名決定使用哪個方法。
2、重載的優點:可以使得程序更加清楚,以及更加具有可讀性。執行同樣功能但是具有不同參數類型的方法應該使用同樣的名字。
注:
1)被重載的方法必須具有不同的參數列表。不能基於不同修飾符或返田值類型來重載方法。
2)有時調用一個方法時,會有兩個或更多可能的匹配,但是,編譯器無法判斷哪個是最精確的匹配。這稱爲歧義調用( ambiguous invocation)。歧義調用會產生一個編譯錯誤。
考慮如下代碼:
class Test01{
public static void main(String[] args){
System.out.println(add(3,3));
}
public static double add(int a,double b){
System.out.println("int+double");
return a+b;
}
public static double add(double a,int b){
System.out.println("double+int");
return a+b;
}
}
六、變量的作用域
變量的作用域是指變量可以在程序中引用的範圍。
局部變量:在方法中定義的變量,其作用域從聲明變量的地方開始,直到包含該變量的塊結束爲止。局部變量都必須
在使用之前進行聲明和陚值。可以在一個方法中的不同塊裏聲明同名的局部變量,但是不能在嵌套塊中或同一塊中兩次聲明同一
個局部變量,— 個變量可以在非嵌套的塊中多次聲明,而在嵌套塊中只能聲明一次。不要在塊內聲明一個變量然後企圖在塊外使
用它。下面是一個常見錯誤的例子:
int sum = 0;
for(int i =1;i<=8;i++){
sum =sum + i;
}
i=sum + 1;
System.out.print(i);
因爲變量 i 沒有在 for 循環外定義,所以i = sum + 1;就會產生一個語法錯誤。
全局變量:在方法外定義的變量,在整個工程文件內都有效;即從定義變量的位置到本源文件結束都有效。由於同一文件中的所
有函數都能引用全局變量的值,因此如果在一個函數中改變了全局變量的值, 就能影響到其他函數中全局變量的值。