在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/Java/ 【JAVA小白】問(wèn)關(guān)于變量作用域的問(wèn)題

【JAVA小白】問(wèn)關(guān)于變量作用域的問(wèn)題

題目如下:

加粗文字clipboard.png

clipboard.png

標(biāo)準(zhǔn)答案選擇B
我在想,這個(gè)里面的change方法,為什么無(wú)法修改str的值???
是否是因?yàn)榫植孔兞繜o(wú)法修改全局變量呢?
問(wèn)題是上面的

String str = new String("good");

這一句話,也沒(méi)有static啊。我暈了,不是說(shuō)帶有static的才是全局變量么?
初學(xué)者,不太懂,問(wèn)題比較淺顯,請(qǐng)見(jiàn)諒。

回答
編輯回答
舊酒館

你把change方法里的str = "test ok";換成this.str = "test ok";感受一下?

2017年8月19日 17:45
編輯回答
蝶戀花

這不是變量作用域的問(wèn)題,而是關(guān)于方法傳遞參數(shù)為引用類型時(shí)的問(wèn)題,str="test ok"是直接讓形參指向一個(gè)新的對(duì)象但實(shí)參的ex.str并沒(méi)有改變?cè)瓉?lái)的指向,而ch[0]='g'是修改了ch這個(gè)char數(shù)組對(duì)象(數(shù)組也是一個(gè)對(duì)象)內(nèi)部的屬性,所以方法結(jié)束后ex.str沒(méi)變而ex.ch變了。樓上說(shuō)的更詳細(xì)一些

2017年7月9日 19:33
編輯回答
壞脾滊

這個(gè)問(wèn)題和函數(shù)無(wú)關(guān),主要是Java的參數(shù)傳遞。

new String("good")沒(méi)毛病,生成的是一個(gè)string。
問(wèn)題發(fā)生在調(diào)用change的時(shí)候,參數(shù)分別是strch[].
Java中沒(méi)有引用傳遞,只有值傳遞,但是(注意這個(gè)但是),一個(gè)對(duì)象和一個(gè)數(shù)組作為參數(shù),將會(huì)得到對(duì)象和數(shù)組的引用的值的復(fù)制。

這句話可能有點(diǎn)難理解,我們這么拆分。

首先 ,String str = new String("good"); 這個(gè)時(shí)候我們創(chuàng)建了一個(gè)string對(duì)象,其內(nèi)容是"good",但是這個(gè)對(duì)象不是strstr只是一個(gè)指向這個(gè)對(duì)象的引用。
同理,我們創(chuàng)建一個(gè)數(shù)組chch也不是這個(gè)數(shù)組,是這個(gè)數(shù)組的引用。

這就是為什么我們可以做到str = "abc"而不會(huì)報(bào)錯(cuò)(String對(duì)象是不可改變的),因?yàn)槲覀儾](méi)有修改對(duì)象,我們只是創(chuàng)建了一個(gè)新的"abc"的String,然后修改了這個(gè)引用,讓其指向新的string對(duì)象。

接下來(lái)我們來(lái)看傳參。再次說(shuō)明一下Java的傳參是 值傳遞。

我們?cè)谡{(diào)用之前,我們有一個(gè)str和一個(gè)ch,分別是指向?qū)ο蠛蛿?shù)組的引用。
接下來(lái)傳參。JVM將我們的strch復(fù)制了一份,我這里記作_str_ch,由于是值的復(fù)制
所以復(fù)制出來(lái)的_str_ch和原來(lái)的一樣,也是一個(gè)引用。

所以這就是關(guān)鍵的部分。然后再接下來(lái),在函數(shù)內(nèi)部,_str這個(gè)引用被重新指向了一個(gè)新的String對(duì)象(所以原來(lái)的str沒(méi)有影響)。而下一步,通過(guò)_ch(它和原來(lái)的ch一樣,都是一個(gè)指向那個(gè)數(shù)組的引用),我們直接將那個(gè)數(shù)組的0號(hào)元素修改了,這就導(dǎo)致了原來(lái)數(shù)組所在內(nèi)存被修改了。

所以到最后,表現(xiàn)出來(lái)的結(jié)果就是,在原來(lái)的函數(shù)中,對(duì)strch所指向的值進(jìn)行檢查的時(shí)候,str這個(gè)引用本身和他指向的對(duì)象都沒(méi)變化,所以str保持不變,而ch指向的數(shù)組,被修改了(被復(fù)制的引用指向了真實(shí)地址)。

所以選B。
(手頭沒(méi)有工具,不然可以畫(huà)個(gè)圖展示一下,這里有一個(gè)相關(guān)的說(shuō)明,可以了解一下)

所以這個(gè)問(wèn)題和static沒(méi)有關(guān)系,是一個(gè)Java函數(shù)傳參和變量的類型的思辨。

2018年6月27日 13:53