色欲av一区久久精品_久久综合色综合色88_无码在线观看不卡_色黄视频网站_亚洲国产精品久久久久秋霞66

說(shuō)說(shuō)Java到底是值傳遞仍是引用傳遞

時(shí)間:2023-05-16

說(shuō)句真實(shí)話,離讀者trustyou發(fā)給我這段信息現(xiàn)已過(guò)去1周時(shí)刻了。不是我怠慢,確實(shí)是可更新的內(nèi)容真實(shí)是太多了。這不,又有兩個(gè)讀者不約而同地要求我更新一下Java究竟是值傳遞仍是引證傳遞方面的文章——其實(shí)這個(gè)問(wèn)題我之前是寫過(guò)的,但現(xiàn)在看起來(lái)答案好像不夠盡善盡美,所以打算以面試的角度重寫一篇。
七年前,我從溫和濕潤(rùn)的蘇州回到古色古香的洛陽(yáng),抱著一幅“全國(guó)我有”的心態(tài)“約談”了幾位面試官。其中有一位叫老馬,讓我印象深刻。由于他其時(shí)扔了一個(gè)面試題把我砸懵了:說(shuō)說(shuō)Java究竟是值傳遞仍是引證傳遞吧。
我其時(shí)年輕氣盛,自認(rèn)為所有的面試題都能對(duì)答如流,沒(méi)想到被老馬“刁難”了——本來(lái)洛陽(yáng)這塊互聯(lián)網(wǎng)的荒漠也有技術(shù)專家啊。現(xiàn)在回想起來(lái),臉上不自覺(jué)地就泛起了慚愧的紅暈:其時(shí)真菜!不管怎么說(shuō),是時(shí)分寫篇文章剖析一下值傳遞仍是引證傳遞的差異了。
將參數(shù)傳遞給辦法有兩種常見(jiàn)的辦法,一種是“值傳遞”,一種是“引證傳遞”。C語(yǔ)言本身只支撐值傳遞,它的衍生品C++既支撐值傳遞,也支撐引證傳遞,而Java只支撐值傳遞。
01、值傳遞VS引證傳遞
首先,咱們必需求搞清楚,究竟什么是值傳遞,什么是引證傳遞,不然,討論Java究竟是值傳遞仍是引證傳遞就顯得毫無(wú)意義。
當(dāng)一個(gè)參數(shù)按照值的辦法在兩個(gè)辦法之間傳遞時(shí),調(diào)用者和被調(diào)用者其實(shí)是用的兩個(gè)不同的變量——被調(diào)用者中的變量(原始值)是調(diào)用者中變量的一份拷貝,對(duì)它們當(dāng)中的任何一個(gè)變量修正都不會(huì)影響到另外一個(gè)變量。
而當(dāng)一個(gè)參數(shù)按照引證傳遞的辦法在兩個(gè)辦法之間傳遞時(shí),調(diào)用者和被調(diào)用者其實(shí)用的是同一個(gè)變量,當(dāng)該變量被修正時(shí),兩邊都是可見(jiàn)的。
Java程序員之所以容易搞混值傳遞和引證傳遞,主要是由于Java有兩種數(shù)據(jù)類型,一種是根本類型,比如說(shuō)int,另外一種是引證類型,比如說(shuō)String。
根本類型的變量存儲(chǔ)的都是實(shí)際的值,而引證類型的變量存儲(chǔ)的是目標(biāo)的引證——指向了目標(biāo)在內(nèi)存中的地址。值和引證存儲(chǔ)在stack(棧)中,而目標(biāo)存儲(chǔ)在heap(堆)中。
之所以有這個(gè)差異,是由于:
棧的優(yōu)勢(shì)是,存取速度比堆要快,僅次于直接坐落CPU中的寄存器。但缺點(diǎn)是,棧中的數(shù)據(jù)大小與生計(jì)周期必須是確認(rèn)的。
堆的優(yōu)勢(shì)是可以動(dòng)態(tài)地分配內(nèi)存大小,生計(jì)周期也不必事前告知編譯器,Java的廢物回收器會(huì)主動(dòng)收走那些不再運(yùn)用的數(shù)據(jù)。但由于要在運(yùn)行時(shí)動(dòng)態(tài)分配內(nèi)存,存取速度較慢。Java
02、根本類型的參數(shù)傳遞
眾所周知,Java有8種根本數(shù)據(jù)類型,分別是int、long、byte、short、float、double、char和boolean。它們的值直接存儲(chǔ)在棧中,每逢作為參數(shù)傳遞時(shí),都會(huì)將原始值(實(shí)參)復(fù)制一份新的出來(lái),給形參用。形參將會(huì)在被調(diào)用辦法結(jié)束時(shí)從棧中鏟除。
來(lái)看下面這段代碼:
publicclassPrimitiveTypeDemo{
publicstaticvoidmain(String[]args){
intage=18;
modify(age);
System.out.println(age);
}
privatestaticvoidmodify(intage1){
age1=30;
}
}
1)main辦法中的age是根本類型,所以它的值18直接存儲(chǔ)在棧中。
2)調(diào)用modify()辦法的時(shí)分,將為實(shí)參age創(chuàng)立一個(gè)副本(形參age1),它的值也為18,不過(guò)是在棧中的其他位置。
3)對(duì)形參age的任何修正都只會(huì)影響它自身而不會(huì)影響實(shí)參。
03、引證類型的參數(shù)傳遞
來(lái)看一段創(chuàng)立引證類型變量的代碼:
Writerwriter=newWriter(18,”緘默沉靜王二”);
writer是目標(biāo)嗎?仍是目標(biāo)的引證?為了搞清楚這個(gè)問(wèn)題,咱們可以把上面的代碼拆分為兩行代碼:
Writerwriter;
writer=newWriter(18,”緘默沉靜王二”);
假設(shè)writer是目標(biāo)的話,就不需求經(jīng)過(guò)new關(guān)鍵字創(chuàng)立目標(biāo)了,對(duì)吧?那也就是說(shuō),writer并不是目標(biāo),在“=”操作符執(zhí)行之前,它僅僅是一個(gè)變量。那誰(shuí)是目標(biāo)呢?newWriter(18,”緘默沉靜王二”),它是目標(biāo),存儲(chǔ)于堆中;然后,“=”操作符將目標(biāo)的引證賦值給了writer變量,于是writer此刻應(yīng)該叫目標(biāo)引證,它存儲(chǔ)在棧中,保存了目標(biāo)在堆中的地址。
每逢引證類型作為參數(shù)傳遞時(shí),都會(huì)創(chuàng)立一個(gè)目標(biāo)引證(實(shí)參)的副本(形參),該形參保存的地址和實(shí)參一樣。
來(lái)看下面這段代碼:
publicclassReferenceTypeDemo{
publicstaticvoidmain(String[]args){
Writera=newWriter(18);
Writerb=newWriter(18);
modify(a,b);
System.out.println(a.getAge());
System.out.println(b.getAge());
}
privatestaticvoidmodify(Writera1,Writerb1){
a1.setAge(30);
b1=newWriter(18);
b1.setAge(30);
}
}
1)在調(diào)用modify()辦法之前,實(shí)參a和b指向的目標(biāo)是不一樣的,盡管age都為18。
2)在調(diào)用modify()辦法時(shí),實(shí)參a和b都在棧中創(chuàng)立了一個(gè)新的副本,分別是a1和b1,但指向的目標(biāo)是一致的(a和a1指向目標(biāo)a,b和b1指向目標(biāo)b)。
3)在modify()辦法中,修正了形參a1的age為30,意味著目標(biāo)a的age從18變成了30,而實(shí)參a指向的也是目標(biāo)a,所以a的age也變成了30;形參b1指向了一個(gè)新的目標(biāo),隨后b1的age被修正為30。
修正a1的age,意味著同時(shí)修正了a的age,由于它們指向的目標(biāo)是一個(gè);修正b1的age,對(duì)b卻沒(méi)有影響,由于它們指向的目標(biāo)是兩個(gè)。
程序輸出的成果如下所示:
果然和咱們的剖析是符合的。
04、最后
好了,我親愛(ài)的讀者朋友,以上就是本文的全部?jī)?nèi)容了。看完之后,再遇到面試官問(wèn)Java究竟是值傳遞仍是引證傳遞時(shí),就不必?fù)?dān)心被刁難了。我是緘默沉靜王二,一枚有趣的程序員。原創(chuàng)不易,莫要白票,請(qǐng)你為本文點(diǎn)贊個(gè)吧,這將是我寫作更多優(yōu)質(zhì)文章的最強(qiáng)動(dòng)力。

文章標(biāo)簽:

Copyright ? 2016 廣州思洋文化傳播有限公司,保留所有權(quán)利。 粵ICP備09033321號(hào)

與項(xiàng)目經(jīng)理交流
掃描二維碼
與項(xiàng)目經(jīng)理交流
掃描二維碼
與項(xiàng)目經(jīng)理交流
ciya68