通過以上內容的學習,可以看出方法是一段可以完成某個特定功能的并且可以被重復利用的代碼片段。接下來我們來學習一下方法應該怎么定義以及怎么調用。
定義/聲明方法的語法格式如下所示:
[修飾符列表] 返回值類型 方法名(形式參數列表){
方法體;
}
例如代碼:
public static void sumInt(int a , int b){
int c = a + b;
System.out.println(a + "+" + b + "=" + c);
}
public static是修飾符列表;
void是返回值類型;
sumInt是方法名;
(int a , int b)是形式參數列表,簡稱形參,每一個形參都是局部變量;
形參后面使用一對兒大括號括起來的是方法體,方法體是完成功能的核心代碼,方法體中的代碼有執行順序的要求,遵循自上而下的順序依次逐行執行,不存在跳行執行的情況。
再如代碼:
public static int sumInt(int a , int b){
int c = a + b;
return c;
}
以上程序中sumInt之前的int是返回值類型。
接下來我將列出方法的相關規則,其中一些規則目前可能需要大家死記硬背,還有一些規則希望大家在理解的前提下進行記憶:
● [修飾符列表],此項是可選項,不是必須的,目前大家統一寫成public static,后面的課程會詳細講解。
● 返回值類型,此項可以是java語言當中任何一種數據類型,包括基本數據類型,也包括所有的引用數據類型,當然,如果一個方法執行結束之后不準備返回任何數據,則返回值類型必須寫void。返回值類型例如:byte,short,int,long,float,double,boolean,char,String,void等。
● 方法名,此項需要是合法的標識符,開發規范中要求方法名首字母小寫,后面每個單詞首字母大寫,遵循駝峰命名方式,見名知意,例如:login、getUsername、findAllUser等。
● 形式參數列表(int a, int b),此項又被稱為形參,其實每一個形參都是“局部變量”,形參的個數為0~N個,如果是多個參數,則采用半角“,”進行分隔,形參中起決定性作用的是參數的數據類型,參數名就是變量名,變量名是可以修改的,也就是說(int a , int b)也可以寫成(int x , int y)。
● 方法體,由一對兒大括號括起來,在形參的后面,這個大括號當中的是實現功能的核心代碼,方法體由java語句構成,方法體當中的代碼只能遵循自上而下的順序依次逐行執行,不能跳行執行,核心代碼在執行過程中如果需要外部提供數據,則通過形參進行獲取。
整體來說方法的聲明語法是很簡單的,我相信每個人都能記住,其實我覺得方法的定義難度最大的不是語法,而是方法在定義的時候,返回值類型定為什么類型比較合適?方法的形式參數列表中定義幾個參數合適?每個參數的數據類型定義為什么比較合適?以上的一系列問題實際上還是需要和具體的功能結合在一起才能決定,當然,這不是一天兩天的事兒,不是說這一章節的內容學完之后就真正的會定義方法了,我們只能說語法會了,還需要后期不斷的做項目,寫代碼才能找到感覺,找到編程思路。到那時,你自然就會定義返回值類型、形式參數列表了。
當一個方法聲明之后,我們應該如何去讓這個方法執行呢,當然,這個時候就需要親自去調用這個方法了,調用方法的語法格式是(前提是方法的修飾符列表中帶有static關鍵字):“類名.方法名(實際參數列表);”,例如以下代碼:
public class MethodTest {
public static void main(String[] args) {
MethodTest.sumInt(100, 200);
MethodTest.sumDouble(1.0, 2.0);
}
public static void sumInt(int x , int y){
System.out.println(x + "+" + y + "=" + (x + y));
}
public static void sumDouble(double a , double b){
System.out.println(a + "+" + b + "=" + (a + b));
}
}
運行結果如下圖所示:
圖7-2:方法如何調用
需要注意的是,方法在調用的時候,實際傳給這個方法的數據被稱為實際參數列表,簡稱實參,java語法中有這樣的規定:實參和形參必須一一對應,所謂的一一對應就是,個數要一樣,數據類型要對應相同。例如:實參(100 , 200)對應的形參(int x , int y),如果不是一一對應則編譯器就會報錯。當然也可能會存在自動類型轉換,例如:實參(100 , 200)也可以傳遞給這樣的形參(long a , long b),這里我們先不談這個。
實際上方法在調用的時候,有的情況下“類名.”是可以省略的,我們來看看什么情況下它可以省略不寫:
public class MethodTest03 {
public static void main(String[] args) {
sumInt(100, 200); //“類名.”可以省略
sumDouble(1.0, 2.0);//“類名.”可以省略
//doOther(); //編譯報錯
Other.doOther(); //“類名.”不能省略
}
public static void sumInt(int x , int y){
System.out.println(x + "+" + y + "=" + (x + y));
}
public static void sumDouble(double a , double b){
System.out.println(a + "+" + b + "=" + (a + b));
}
}
public class Other{
public static void doOther(){
System.out.println("Other doOther...");
}
}
運行結果如下圖所示:
圖7-3:“類名.”什么時候可以省略
通過以上程序的分析,我們得知,當在a()方法執行過程中調用b()方法的時候,并且a()方法和b()方法在同一個類當中,此時“類名.”可以省略不寫,但如果a()方法和b()方法不在同一個類當中,“類名.”則不能省略。