java學習(四)——方法和參數傳遞機制

方法

1.方法:完成特定功能的代碼塊,在C語言中被稱爲函數
2.定義方法的格式:

		[修飾符] 返回值類型 方法名(形式參數列表)
		{			
					方法體
					[return 返回值;]
		}
	注:1.參數列表中的參數可以有一個或多個,也可以沒有參數
   	   2.return 返回到方法調用者,方法調用者也稱爲這個方法的隱式參數。main()方法是java的虛擬機調用的		
   	   3.在方法體中(或方法聲明中)定義的變量叫做   局部變量 。局部變量通常在棧中創建,它的作用域是包含它的塊。

方法的重載

方法簽名:方法名和參數類型叫做方法的簽名
注:返回類型不是方法簽名的一部分

在同一個類中,允許存在一個以上的同名方法,它們的參數個數和參數類型不同。這種現象就叫做方法的重載
注:1.方法的重載與其返回值類型無關,只與參數類型和參數個數有關
2.在調用過程中,虛擬機通過不同的參數列表區別同名方法,並調用相應的方法,這個過程叫做重載解析

public class Function
{
	public static int sum(int a,int b){
		return a+b;
	}
	//該方法重載了上述sum(int a,int b)方法
	public static int sum(int a,int b,int c){
		return a+b+c;
	}
	//該方法重載了上述sum(int a,int b)方法
	public static String sum(String a,int b,int c,int d){
		return a+b+c+d;
	}
	public static void main(String[] args)
	{
		System.out.println(sum(1,2));
		System.out.println(sum(1,2,3));
		System.out.println(sum("Hello",1,3,5));
	}
}

運行結果
在這裏插入圖片描述

#### 基本數據類型做參數 和 引用數據類型做參數 的區別
當形式參數是基本數據類型時,調用方法實際上是把實參拷貝一份賦給形參,形參的改變不影響實參的值。
當形式參數是引用數據類型時,調用方法實際是把實參的地址拷貝一份賦給形參,形參的改變會影響到實參的值。

2018.11.2日修改:起****************************************************************************************

將實參傳遞給方法(或函數),一般有以下幾種
1.按值調用:表示方法接受到的是調用者提供的值。
2.按引用調用:表示方法接受的是調用者提供的變量地址。
3.按名調用(已不在使用)

java採用的是按值調用,也就是說,無論實參是基本數據類型還是引用數據類型,方法接受到的都是調用者提供的值(即把實參的值拷貝一份傳遞給形參)。那爲什麼在使用基本數據類型和引用數據類型時造成的結果不同呢?

基本數據類型的實參存儲的是基本數據類型的值,而引用數據類型存儲的對象的引用(即對象在堆內存中的地址)。當引用數據類型的實參傳遞給方法時,由於形參和實參都引用了同一個對象,所以修改形參引用對象的值就會影響到實參引用對象的值, 而基本數據類型並沒有共同的引用,所以形參的變化不會影響到實參的值。
同時,由於是按值傳遞的。修改形參的引用並不會影響到實參的引用

public class FunctionTest
{
	public static void main(String[] args)
	{
		//基本類型做參數
		Function t1=new Function();
		//調用前
		int a=3;
		System.out.println("調用前:a="+a);
		t1.printA(a);
		//調用後
		System.out.println("調用後:a="+a);

		//引用數據類型做參數
		Demo d1=new Demo();
		//調用前
		d1.age=16;
		System.out.println("調用前:年齡age="+d1.age);
		
		t1.show(d1);
		//調用後
		System.out.println("調用後:年齡age="+d1.age);
	}
}
class Demo
{
	int age;
	public void show()
	{
		System.out.println("年齡age="+age);
	}
}
class Function
{
	public void printA(int a)
	{
		a=10;		
		System.out.println("printA中修改a後:a="+a);
	}
	public void show(Demo s)
	{
		s.age=45;
		s.show();
	}
}

運行結果
在這裏插入圖片描述
那麼按引用調用是什麼樣子的呢?(可能大概差不多(~ ̄▽ ̄)~ 如下):

#include<stdio.h>
typedef struct {
    char name[10];
    int no;
}Student;
void swap(Student *b,Student *a)
{
    Student p=*a;
    *a=*b;
    *b=p;
}
int main()
{
    Student s1={"葉葉",10};
    Student s2={"花花",8};
    printf("s1的姓名:%s,編號:%d\n",s1.name,s1.no);
    printf("s2的姓名:%s,編號:%d\n",s2.name,s2.no);
    swap(&s1,&s2);
    printf("s1的姓名:%s,編號:%d\n",s1.name,s1.no);
    printf("s2的姓名:%s,編號:%d\n",s2.name,s2.no);
}

運行結果
在這裏插入圖片描述
2018.11.2日修改:終****************************************************************************************

String 類型做參數

String是引用數據類型,在調用方法時傳遞的是地址。但是在方法中改變形參的值並不會影響實際參數的值。如下

主方法把str的地址傳給形參pstr,當printStr()方法中的pstr改變時,實際上是新創建了一個字符串“花花”,然後讓pstr指向它(而主方法中的str的指向沒變),並沒有在原來的指向上進行修改。所以String類做形參時,雖然是傳遞地址,但是形參的變化不會影響實參的值。

public class FounctionTest
{
	public static void printStr(String pstr)
	{
		pstr="花花";
		System.out.println("方法中的pstr="+pstr);
	}
	public static void main(String[] args)
	{
		String str="葉葉";
		//調用方法前
		System.out.println("調用前str="+str);
		
		printStr(str);

		//調用方法後
		System.out.println("調用後str="+str);
	}	
} 

運行結果
在這裏插入圖片描述

返回目錄

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