Java中有關方法的簡單總結

Java有關方法的總結

1.      方法概述

2.      不同類型的方法

3.      方法的調用形式

1.      方法概述

CC++中用函數這個術語來描述命名子程序,而在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.      不同類型的方法

這裏所說的不同類型是指返回類型

基本類型:intdoublefloatbooleancharbytelongshort

無返回型: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仍然指向原來的區域,所以會出現值被修改了的結果。

在以這種方式調用方法的時候依然是值調用,上述拷貝被稱之爲淺拷貝。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章