Method


1 呼叫和宣告

上章節有講過方法如何呼叫及宣告方法,以下再回顧一次

ObjectName.functionName( parameter );
taxi.car_break();
-----------------
Taxi煞車中

2 返回型態

2-1宣告返回型態
//返回值void的意思即是沒有返回值
public void sayHello(){ 
    System.out.println("Hello");
}

//返回值int表示會reurn一個int型態的值
public int subtract(int x,int y){
    return x-y;
}

//返回值String表示會reurn一個String型態的值
public String Hello(){
    return "Hello";
}

除了void之外,其他返回值都需要使用return,不然會有編譯錯誤

2-2 接收返回值

比較看看若要列印出Hello,使用sayHello()與Hello()差異在哪裡

sayHello();
String s=Hello();
System.out.println(s);
---------------------
Hello 
Hello
  • 第一行Hello : sayHello()列印出的hello
  • 第二行Hello : 先從hello()取得return回來的string,將其值丟入String s裡,再將s列印出來

3 傳值呼叫vs傳參考呼叫

3-1 傳值呼叫
//PURPOSE:Plus1_CallByValue傳值呼叫
public class MainClass {

    public static void main(String[] args) {
        int a=1;
        Plus1_CallByValue(a);
        System.out.println("a="+a);
    }

    public static void Plus1_CallByValue(int a){
        a++;
    }
}
--------------------------------
1

只要function的參數為基本型態,就會使用傳值呼叫

傳值呼叫顧名思義,他就是只傳了過去而已

public static void Plus1(int a){....}

還記得我說過一個變數存活的範圍,只有包住變數最內層的{ }而已,所以雖然下面的變數跟上面的變數都叫做a,但他們指的是不同的東西,所以最後當我們列印上面的a時,他並沒有被加1

3-2 傳參考呼叫
//PURPOSE:Plus2_CallByReference傳參考呼叫
public class MainClass {

    public static void main(String[] args) {

        int[] array=new int[1];
        array[0]=1;

        Plus2_CallByReference(array);
        System.out.println("array[0]="+array[0]);
    }

    public static void Plus2_CallByReference(int[] array2){
        array2[0]++;
    }

}
------------------------------
2

只要function的參數為物件型態,就會使用傳參考呼叫

以上述程式碼為例,將陣列array傳入Plus2_CallByReference(),他有了一個新的名字array2,若我們將array2[0]++,array[0]也會被++,原因在於這時的array2其實指的就是我們傳進來的array

同樣是進行++,可以比較一下上面傳值呼叫與下面傳參考呼叫差異性在哪

2-3 OverLoad

在定義方法時,有時候函式執行的目的是一致的,但是參數的個數或是型態不同,這時候就可以用到重載overload。

編譯器會依照你給的參數來選擇使用哪一個函式

//PURPOSE:sum函式實作了重載
public class Calculator {
    public int sum(int a,int b,int c){
        return a+b+c;
    }
    public double sum(double a,double b,double c){
        return a+b+c;
    }
}
public class Test {
    public static void main(String[] args) {
        Calculator c=new Calculator();
        System.out.println(c.sum(10, 20, 30));
        System.out.println(c.sum(10.3, 20.3, 30.3));
    }
}
----------------------------
60
60.900000000000006

第一行println呼叫的是回傳值為int的sum函式,第二行則呼叫回傳值為double的

注意,若僅僅是回傳值不同,但參數部分相同的話,不會通過編譯,沒辦法實作重載

編譯器是透過參數的不同來分辨相同名稱的函數,所以僅僅是回傳值不同的話,會被當作兩個一模一樣的function。

以下例子就無法通過編譯

//PURPOSE:錯誤重載示範
//ERROR: Duplicate method sum() in type Calculator

public class Calculator {
    public int sum(){
        return 1;
    }
    public double sum(){
        return 1.1;
    }
}

2-4 不定長度參數

不定長度的參數使用... 的語法

這樣無論輸入多少個參數,他都會將他按照順序丟進array裡面

(型態... 參數名稱)
//PURPOSE:sum函式相加3個變數與相加多個變數
public class Calculator {
    public int sum(int a,int b,int c){
        return a+b+c;
    }
    public int sum(int... a){
        int s=0;
        for(int value:a){
            s+=value;
        }
        return s;
    }
}
public class MainClass {

    public static void main(String[] args) {
        Calculator c=new Calculator();
        System.out.println("1+2+3="+c.sum(1,2,3)+" //使用三個參數的sum function");
        System.out.println("1+2+3+4+5+6="+c.sum(1,2,3,4,5,6)+" //使用不定數量參數的sum function");
    }
}
------------------------------
1+2+3=6 //使用三個參數的sum function
1+2+3+4+5+6=21 //使用不定數量參數的sum function

上例將1,2,3,4,5,6按照順序丟進a這個陣列裡面,要存取每一個參數,只要像取得陣列每一個元素一樣使用就可以了

results matching ""

    No results matching ""