1. 程式人生 > 其它 >JAVA 併發程式設計-返回執行結果(Callable和Future)

JAVA 併發程式設計-返回執行結果(Callable和Future)

技術標籤:Java基礎java

本文將從以下六個方面來講解Java方法:

  1. 何謂方法;

  2. 方法的定義及呼叫;

  3. 方法過載;

  4. 命令列傳參;

  5. 可變引數;

  6. 遞迴。

一、何謂方法

我們經常使用到 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中,根據上面的步驟,自行檢視執行過程。

設計方法的原則

  1. 方法命名:首字母小寫,駝峰原則。例如:addSalary
  2. 方法功能:一個方法只完成一個功能,即方法的原子性

我們的main方法要儘量保持簡潔明瞭,把程式需要使用的功能全都寫在其他的方法裡,需要使用時,直接呼叫即可。

二、方法的定義及呼叫

一般情況下,定義一個方法包含以下語法:

修飾符 返回值型別 方法名(引數型別 引數名){
    ...
    方法體
    ...
    return 返回值;
}
  • 修飾符:這是可選的,常見的修飾符例如:publicstatic……
  • 返回值型別:方法可能會返回值。 例如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);便是遞迴體。)