Java有關方法的總結
1. 方法概述
2. 不同類型的方法
3. 方法的調用形式
1. 方法概述
在C、C++中用函數這個術語來描述命名子程序,而在Java中用方法這個術語來表示“做某些事情的方式”。Java中的方法決定了一個對象能夠接受什麼樣的消息,方法的基本組成包括:名稱、參數、返回值和方法體
修飾符 返回值類型 方法名(參數列表){
方法體;
}
例如:
public static int max(int num1,int num2){
int result;
if(num1 > num2)
result = num1;
else
result = num2;
return result;
}
num1,num2被稱之爲形式參數(formal parameter),當調用該方法是傳遞的參數被稱之爲實際參數(actual parameter)
Java中的方法是基於對象的,只能作爲類的一部分來創建,且只能通過對象來被調用,除了靜態(static ,針對於類)方法>
2. 不同類型的方法
這裏所說的不同類型是指返回類型
基本類型:int、double、float、boolean、char、byte、long、short
無返回型:void
用戶自定義類型:用戶創建的類型
3. 方法調用,這裏主要總結方法調用過程以及Java在方法調用時參數的傳遞形式
- 方法的調用過程
public class TestMax {
/**
* 演示方法調用過程
* @author LiMing
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int i=1;
int j=2;
int k=max(i,j);
System.out.println("Max is:"+k);
}
public static int max(int num1,int num2){
int result;
if(num1 > num2)
result = num1;
else
result = num2;
return result;
}
}
當程序調用一個方法時,程序控制語句就會轉移到被調用的方法中,當執行完return語句或者執行到表示方法結束的右括號時,被調用方法把控制權還給調用者。我們來看看在系統內部是如何實現方法的調用的:
每當調用一個方法時系統都會將參數、變量存儲在一個稱之爲堆棧(Stack)的內存區域,他以後進先出的形式存儲數據,當一個方法調用令另一個方法時,調用者的堆棧空間保持不動,新開闢的空間處理新方法的調用。當一個方法結束返回到調用者的時候,其相應的空間也就會被釋放
該圖演示了上述程序執行過程。
- 參數傳遞
在程序設計語言中有關參數傳遞的一些術語,值調用(call by value)表示方法接收到的是調用者提供的值。引用調用(call by reference)表示方法接收到的是調用者提供的變量的地址。Java總是採用值調用的。
public class TestMax { /** * 演示Java方法參數傳遞形式 * @author LiMing */ public static void main(String[] args) { // TODO Auto-generated method stub int num=0; raise(num); System.out.println("After funtction raise(),num is :"+num); } public static void raise(int x){ x = x+1; System.out.println("In the Method,x is :"+x); } }
討論上述代碼執行過程:
方法在調用時傳遞的其實是num的一個拷貝,raise方法調用結束後,x變量便不再使用
然而,方法參數共有兩種類型:
- 基本數據類型
- 對象引用
已經可以看到,一個方法不能修改一個基本類型數據的參數,下面我們來看對於對象引用是否如此:
public class TestMax {
/**
* 演示Java方法參數傳遞形式
* @author LiMing
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Person p1=new Person(100);
Person p2=new Person(200);
swap(p1,p2);
System.out.println("After function swap(): p1'money:"+p1.getMoney()+" p2'money:"+p2.getMoney());
}
public static void swap(Person p1,Person p2){
double temp=p2.getMoney();
p2.setMoney(p1.getMoney());
p1.setMoney(temp);
System.out.println("In The method: p1'money:"+p1.getMoney()+" p2'money:"+p2.getMoney());
}
}
class Person{
public Person(double m){
money=m;
}
public double getMoney(){
return money;
}
public void setMoney(double m){
money=m;
}
private double money;
}
下面是程序的輸出:
我們驚奇的發現值被改變了,其實內部的運行情況是這樣的:
調用方法時首先拷貝出p1和p2的引用,並且拷貝出來的指向相同的區域,通過swap方法交換money後,原來的p1以及p2仍然指向原來的區域,所以會出現值被修改了的結果。
在以這種方式調用方法的時候依然是值調用,上述拷貝被稱之爲淺拷貝。