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這個陣列裡面,要存取每一個參數,只要像取得陣列每一個元素一樣使用就可以了