JAVA 併發程式設計-返回執行結果(Callable和Future)
本文將從以下六個方面來講解Java方法:
-
何謂方法;
-
方法的定義及呼叫;
-
方法過載;
-
命令列傳參;
-
可變引數;
-
遞迴。
一、何謂方法
我們經常使用到 System.out.println(),它是什麼呢?
- System 是系統類。
- out 是標準輸出物件。
- println() 是一個方法。
這句話的用法是呼叫系統類 System 中的標準輸出物件 out 中的方法 println()。
那麼什麼是方法呢?
Java方法是語句的集合,它們在一起執行一個功能。
- 方法是解決一類問題的步驟的有序組合
- 方法包含於類或物件中
- 方法在程式中被建立,在其他地方被引用
例如,我們在Java程式中經常見到的 public static void main(String[] args) {}
,其實就是一種方法,我們稱之為main方法。
接下來我們嘗試著寫一個加法方法:
public static int add(int a,int b){
return a+b;
}
並在main方法裡呼叫add方法:
public static void main(String[] args) {
int sum = add(1,2);
System.out.println(sum);
}
輸出結果為3。
這個過程是怎麼執行的呢?我們可以在idea中檢視執行過程。
第一步:在程式碼左側打上斷點:
第二步:點選Debug:
第三步:點選檢視下一步:
大家可以將程式碼輸入到idea中,根據上面的步驟,自行檢視執行過程。
設計方法的原則
- 方法命名:首字母小寫,駝峰原則。例如:
addSalary
- 方法功能:一個方法只完成一個功能,即方法的原子性。
我們的main方法要儘量保持簡潔明瞭,把程式需要使用的功能全都寫在其他的方法裡,需要使用時,直接呼叫即可。
二、方法的定義及呼叫
一般情況下,定義一個方法包含以下語法:
修飾符 返回值型別 方法名(引數型別 引數名){ ... 方法體 ... return 返回值; }
- 修飾符:這是可選的,常見的修飾符例如:
public
、static
…… - 返回值型別:方法可能會返回值。 例如
int
型別。有些情況下不會返回值,例如void
。 - 方法名:方法的實際名稱。可以根據情況隨意命名,但一定要遵守命名規範,即首字母小寫,駝峰原則。
- 引數型別:引數像是一個佔位符。當方法被呼叫時,傳遞值給引數。引數是可選的,方法可以不包含任何引數。
- 形式引數:可以簡單理解為,定義時使用的引數。
- 實參:呼叫方法時實際傳給方法的資料。
- 方法體:方法體包含具體的語句,定義該方法的功能。
我們定義一個比較大小的方法,並在main方法中進行呼叫:
public static void main(String[] args) {
int max = max(10,10); //呼叫方法
System.out.println(max);
}
//比大小
public static int max(int num1,int num2){
int result = 0; //必須設定初始值,否則會報錯
if(num1==num2){
System.out.println("num1==num2");
return 0; //終止方法
}
if(num1>num2){
result = num1;
}else {
result = num2;
}
return result; //返回結果值
}
得到的結果為:
num1==num2
0
這裡需要知道的是,return 0;
可以用於終止方法。
三、方法的過載
上面使用的max方法僅僅適用於int型資料。如果想得到兩個浮點型別資料的最大值呢?
解決方法是建立另一個名字相同但引數不同的方法,如下面程式碼所示:
//比大小,double
public static double max(double num1,double num2){
double result = 0.0;
if(num1==num2){
System.out.println("num1==num2");
return 0;//終止方法
}
if(num1>num2){
result = num1;
}else {
result = num2;
}
return result;
}
此時我們在main方法中呼叫max方法,並傳遞double型引數,則上面這個方法體會被呼叫。
public static void main(String[] args) {
double max = max(20.0,10.0);
System.out.println(max);
}
得到的結果為:
20.0
如上所示,若呼叫max方法時,
- 傳遞的是int型引數,則 int型引數的max方法體就會被呼叫;
- 傳遞的是double型引數,則double型別的max方法體會被呼叫。
這便是方法過載。
方法過載的規則如下:
-
方法名稱必須相同;
-
引數列表必須不同。(個數不同、型別不同、或引數排列順序不同)
呼叫方法:
- 方法名稱相同時,編譯器會根據方法的引數個數、型別等去逐個匹配,以選擇對應的方法。如果匹配失敗,則編譯器報錯。
四、命令列傳參
有時候我們希望執行一個程式時候再傳遞給它訊息。這要靠傳遞命令列引數給main()函式實現。
關於這個問題,這裡暫時不進行講解。如有需要,可以參考以下視訊進行學習:
五、可變引數
-
從JDK 1.5 開始,Java支援傳遞同類型的可變引數給一個方法。
-
在方法宣告中,在指定引數型別後加一個省略號(…) 。
-
一個方法中只能指定一個可變引數,它必須是方法的最後一個引數。任何普通的引數必須在它之前宣告。
舉一個簡單的例子,如下所示,test方法可以傳遞無限個int型別的值:
public void test(int... i){
System.out.println(i[0]);
System.out.println(i[1]);
System.out.println(i[2]);
}
在main方法中呼叫test方法:
public static void main(String[] args) {
Demo04 demo04 = new Demo04();
demo04.test(1,2,3,4,5);
}
執行後,得到的結果為:
1
2
3
六、遞迴
上面講解的方法,全部都屬於A方法呼叫B方法,這種呼叫方式我們很容易便能理解。
而遞迴則是:A方法呼叫A方法,即自己呼叫自己。
如下所示,f()
方法可以計算階乘,便是應用了遞迴的結構。
public static int f(int n){
if(n==1){
return 1;
}else {
return n*f(n-1);
}
}
}
我們在main方法中呼叫 f()
:
public static void main(String[] args) {
System.out.println(f(4));
}
得到的結果為:
24
遞迴結構包含兩個部分:
- 遞迴頭:什麼時候不呼叫自身方法。如果沒有頭,將陷入死迴圈。也可以稱為遞迴邊界。(在本例子中,當
n==1
時,return 1;
便是遞迴邊界。) - 遞迴體:什麼時候需要呼叫自身方法。(在本例子中,當
n!=1
時,return n*f(n-1);
便是遞迴體。)