Java是當(dāng)今互聯(lián)網(wǎng)行業(yè)中的熱門開發(fā)語言,在java中,由于沒有指針類型,其傳參的方式也發(fā)生了相應(yīng)的變化。中培偉業(yè)《企業(yè)級JAVA開發(fā)最佳實(shí)踐》培訓(xùn)專家李老師根據(jù)網(wǎng)上的信息,按之前的理解,認(rèn)為java中傳參方式應(yīng)該主要有兩種:傳值和傳引用
一、傳值
java中的傳值即傳遞的是原變量的一個副本。基本的數(shù)據(jù)類型,如:char,int,double等類型的變量向函數(shù)傳遞的參數(shù),都是變量的副本都屬于傳值。函數(shù)內(nèi)部不論進(jìn)行任何操作,都不影響變量本身,影響的只是變量的副本。
二、傳引用
從表面上來看,java中的對象類型都是傳遞的引用,而不是傳遞的值。然而,java中對象作為實(shí)參,傳遞的實(shí)際上還是值,即java中的傳參傳遞的都是值!為什么會這么說?我會從jvm的構(gòu)成的角度來解釋一下自己對這個問題的理解。接下來我們先看一下JVM的結(jié)構(gòu):
三、JVM的結(jié)構(gòu)及相應(yīng)的解釋
Jvm在實(shí)現(xiàn)的時候?qū)儆谒膬?nèi)存分為五部分,其中程序代碼(嚴(yán)格的說應(yīng)當(dāng)是字節(jié)碼)和基本的數(shù)據(jù)類型是放在java棧的棧幀中,而對象是從堆中分配的,堆這個東西我認(rèn)為可以理解成“對象池”。程序和程序中需要用到的對象放在兩個相對獨(dú)立的區(qū)域中,那么程序怎么使用對象呢?實(shí)際上是程序中真正使用對象的地方其實(shí)只是聲明了一個對象的引用,也就是把堆中分配了的相應(yīng)對象的地址放到引用中,當(dāng)然引用也是放在棧內(nèi)存中,棧和堆之間就是通過一個一個的引用來聯(lián)系的。至于引用,我們可以把它看做是一個指針常量,說白了,就是一個數(shù)值,這個數(shù)值所表達(dá)的是引用對象的地址。所以,不管是基本類型變量(int,float,double等)還是對象,相應(yīng)的內(nèi)存地址中存放的都是一個數(shù)(無符號整數(shù),整數(shù),浮點(diǎn)數(shù)等)。當(dāng)方法調(diào)用時候,方法的參數(shù)會占內(nèi)存中開辟一塊新的區(qū)域,同時把要傳遞的基本類型,或者引用類型名稱復(fù)制到這塊內(nèi)存中,結(jié)果是,基本類型(存放在占內(nèi)存中的)復(fù)制之后連同其數(shù)值也復(fù)制到了這塊內(nèi)存中,而對象只是復(fù)制了引用名,實(shí)際還要聯(lián)系到原對象所在的堆區(qū)域中。
之所以說java中傳遞的都是值,是因?yàn)閭鬟f得是內(nèi)存地址中的數(shù),當(dāng)然,這個值對于基本類型和對象類型來說意義是不一樣的,對于基本類型這個數(shù)就是其值本身,傳遞值的結(jié)果就是,改變新的變量的值不影響舊的變量的值;而對于對象來說這個數(shù)是它的地址,傳遞這個值就相當(dāng)于傳遞了真實(shí)對象的引用,傳遞了引用或者說是地址的結(jié)果就是變化會全局可見。所以說java中的方法都是按值調(diào)用的!只不過基本類型和對象類型的"值"的在具體的機(jī)制上作用不同。
綜上,java中不論是基本類型還是對象,方法調(diào)用時,傳遞的都是值!
1.對于基本類型的變量,相當(dāng)于操作其副本。
2.對于對象,相當(dāng)于復(fù)制了一個引用,該引用指向的還是原變量的內(nèi)存區(qū)域。
因此,在這些都將在方向都將在這些方向進(jìn)行有效的。只要在相關(guān)的問題在因此在各個過程,都將在相關(guān)的問題都在應(yīng)該進(jìn)行有效展現(xiàn),因此在這些過程都將在新的過程中來展現(xiàn)。
想了解更多IT資訊,請?jiān)L問中培偉業(yè)官網(wǎng):中培偉業(yè)