日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

【解惑】Java方法參數(shù)是引用調(diào)用還是值調(diào)用?

系統(tǒng) 2098 0

? ? ? 方法調(diào)用(call by) 是一個標(biāo)準(zhǔn)的計算機科學(xué)術(shù)語。方法調(diào)用根據(jù)參數(shù)傳遞的情況又分為 值調(diào)用( call by reference ) 引用調(diào)用( call by value ) 。江湖上有很多關(guān)于這兩種調(diào)用的定義 ,最通常的說法是傳遞值的是值調(diào)用,傳遞地址的是引用調(diào)用。這其實很不恰當(dāng),這種 這些說法很容易讓我們聯(lián)想到Java的對象參數(shù)傳遞是引用調(diào)用,實際上, Java的對象參數(shù)傳遞仍然是值調(diào)用

????? 我們首先用一段代碼來證實一下為什么 Java的對象參數(shù)傳遞 是值調(diào)用。

    public class Employee {

	public String name=null;
	
	public Employee(String n){
		this.name=n;
	}
	//將兩個Employee對象交換
	public static void swap(Employee e1,Employee e2){
		Employee temp=e1;
		e1=e2;
		e2=temp;
                System.out.println(e1.name+" "+e2.name); //打印結(jié)果:李四 張三
	}
	//主函數(shù)
	public static void main(String[] args) {
		Employee worker=new Employee("張三");
		Employee manager=new Employee("李四");
		swap(worker,manager);
		System.out.println(worker.name+" "+manager.name); //打印結(jié)果仍然是: 張三 李四
	}
}
  

?

????? 上面的結(jié)果讓人很失望,雖然形參對象e1,e2的內(nèi)容交換了,但實參對象worker,manager并沒有互換內(nèi)容。這里面最重要的原因就在于 形參e1,e2是實參worker,manager的地址拷貝。

????? 大家都知道,在Java中對象變量名實際上代表的是對象在堆中的地址(專業(yè)術(shù)語叫做 對象引用 )。在Java方法調(diào)用的時候,參數(shù)傳遞的是對象的引用。 重要的是,形參和實參所占的內(nèi)存地址并不一樣,形參中的內(nèi)容只是實參中存儲的對象引用的一份拷貝。

???? ? 如果大家對JVM內(nèi)存管理中 Java棧 局部變量區(qū) 有所了解的話(可以參見《 Java 虛擬機體系結(jié)構(gòu) 》),就很好理解上面這句話。在JVM運行上面的程序時,運行main方法和swap方法,會在Java棧中先后push兩個叫做 棧幀 的內(nèi)存空間。main棧幀中有一塊叫局部變量區(qū)的內(nèi)存用來存儲實參對象worker和manager的引用。而swap棧幀中的局部變量區(qū)則存儲了形參對象e1和e2的引用。雖然e1和e2的引用值分別與worker和manager相同,但是它們占用了不同的內(nèi)存空間。當(dāng)e1和e2的引用發(fā)生交換時,下面的圖很清晰的看出完全不會影響worker和manager的引用值。

????????????

????? Java對象參數(shù)傳遞雖然傳遞的是地址(引用),但仍然是值調(diào)用。是時候需要給引用調(diào)用和值調(diào)用一個準(zhǔn)確的定義了。

?

????? 值調(diào)用(call by value) 在參數(shù)傳遞過程中,形參和實參占用了兩個完全不同的內(nèi)存空間。形參所存儲的內(nèi)容是實參存儲內(nèi)容的一份拷貝。 實際上,Java對象的傳遞就符合這個定義,只不過形參和實參所儲存的內(nèi)容并不是常規(guī)意義上的變量值,而是變量的地址。咳,回過頭想想:變量的地址不也是一種值嗎!

????? 引用調(diào)用(call by reference) 在參數(shù)傳遞的過程中,形參和實參完全是同一塊內(nèi)存空間,兩者不分彼此。 實際上,形參名和實參名只是編程中的不同符號,在程序運行過程中,內(nèi)存中存儲的空間才是最重要的。不同的變量名并不能說明占用的內(nèi)存存儲空間不同。

?

????? 大體上說,兩種調(diào)用的根本并不在于傳遞的是值還是地址(畢竟地址也是一個值),而是在于形參和實參是否占用同一塊內(nèi)存空間。事實上,C/C++的指針參數(shù)傳遞也是值調(diào)用,不信試試下面的C代碼吧!

    #include<stdio.h>
void swap(int *a1,int *b1){
	int *t=a1;
	a1=b1;
	b1=t;
}
int main(){
	int x1=100;
	int x2=200;
        int *a=&x1;
	int *b=&x2;
	printf("%d %d\n",*a,*b);
	swap(a,b);
	printf("%d %d\n",*a,*b);
	return 0;
}
  

???????? 但C/C++是有引用調(diào)用的,這就是C/C++一種叫做引用的變量聲明方法: int a; int &ra=a; 其中ra是a的別名,兩者在內(nèi)存中沒有區(qū)別,占用了同一個內(nèi)存空間。而通過引用(別名)的參數(shù)傳遞就符合引用調(diào)用的特點了。大家可以去試試

void swap(int &a1,int &b1);的運行結(jié)果。

?

【解惑】Java方法參數(shù)是引用調(diào)用還是值調(diào)用?


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 阜平县| 三门县| 花垣县| 连山| 唐山市| 武冈市| 曲沃县| 革吉县| 府谷县| 大庆市| 浏阳市| 雷州市| 东乌珠穆沁旗| 甘肃省| 兰考县| 肥城市| 南安市| 当涂县| 涿州市| 万山特区| 惠东县| 大新县| 福鼎市| 基隆市| 南川市| 长春市| 珠海市| 长顺县| 华池县| 勃利县| 莱阳市| 额敏县| 安溪县| 偏关县| 澜沧| 澎湖县| 申扎县| 千阳县| 巨鹿县| 洛南县| 漳浦县|