值傳遞:參數(shù)是基本類型
引用傳遞:參數(shù)是封裝類型
這就要從java底層的機(jī)制講起了踪旷,java的內(nèi)存模型分為堆和棧乍丈。
1.基本類型的變量放在棧里;
2.封裝類型中喉前,對(duì)象放在堆里没酣,對(duì)象的引用放在棧里。
java在方法傳遞參數(shù)時(shí)卵迂,是將變量復(fù)制一份裕便,然后傳入方法體去執(zhí)行。這句話是很難理解的见咒,也是解釋這個(gè) 問(wèn)題的精髓偿衰。我們先按照這句話解釋一下基本類型的傳遞
虛擬機(jī)分配給num一個(gè)內(nèi)存地址,并且存了一個(gè)值0.
虛擬機(jī)復(fù)制了一個(gè)num改览,我們叫他num’下翎,num’和num的內(nèi)存地址不同,但存的值都是0宝当。
虛擬機(jī)講num’傳入方法视事,方法將num’的值改為1.
方法結(jié)束,方法外打印num的值今妄,由于num內(nèi)存中的值沒有改變郑口,還是0,所以打印是0.
我們?cè)俳忉尫庋b類型的傳遞:
虛擬機(jī)在堆中開辟了一個(gè)Product的內(nèi)存空間盾鳞,內(nèi)存中包含proName和num犬性。
虛擬機(jī)在棧中分配給p一個(gè)內(nèi)存地址,這個(gè)地址中存的是1中的Product的內(nèi)存地址腾仅。
虛擬機(jī)復(fù)制了一個(gè)p乒裆,我們叫他p’,p和p’的內(nèi)存地址不同,但它們存的值是相同的推励,都是1中Product的內(nèi)存地址鹤耍。
將p’傳入方法,方法改變了1中的proName和num验辞。
方法結(jié)束稿黄,方法外打印p中變量的值,由于p和p’中存的都是1中Product的地址跌造,但是1中Product里的值發(fā)生了改變杆怕, 所以,方法外打印p的值壳贪,是方法執(zhí)行以后的陵珍。我們看到的效果是封裝類型的值是改變的。
最后我們?cè)賮?lái)解釋String在傳遞過(guò)程中的步驟:
虛擬機(jī)在堆中開辟一塊內(nèi)存违施,并存值”ab”互纯。
虛擬機(jī)在棧中分配給str一個(gè)內(nèi)存,內(nèi)存中存的是1中的地址磕蒲。
虛擬機(jī)復(fù)制一份str留潦,我們叫str’,str和str’內(nèi)存不同辣往,但存的值都是1的地址愤兵。
將str’傳入方法體
方法體在堆中開辟一塊內(nèi)存,并存值”cd”
方法體將str’的值改變排吴,存入5的內(nèi)存地址
方法結(jié)束秆乳,方法外打印str,由于str存的是1的地址钻哩,所有打印結(jié)果是”ab”