9 回答

TA貢獻(xiàn)46條經(jīng)驗(yàn) 獲得超27個(gè)贊
Java里只有按值傳遞,沒(méi)有按引用傳遞,之所以傳遞對(duì)象后能可改變這個(gè)對(duì)象的屬性,是因?yàn)樵诜椒ㄖ校?strong>傳遞的是一個(gè)該對(duì)象的副本,然后這個(gè)副本指向的是該傳遞過(guò)來(lái)的對(duì)象所指向的堆內(nèi)存中的對(duì)象,所以,修改了副本所指向的屬性同樣會(huì)修改原始對(duì)象的屬性,但是,當(dāng)使用new時(shí),副本和對(duì)象不再指向同一個(gè)地址,副本指向了一個(gè)新的地址,傳入的參數(shù)還是指向原來(lái)的地址,所以,樓主這題里雖然在initUser中初始化了User對(duì)象,但是只是在這個(gè)initUser中user不是空的,傳遞過(guò)來(lái)的user依然是空的,也就是并沒(méi)有初始化外面addUser函數(shù)里的user對(duì)象,所以會(huì)空指針異常

TA貢獻(xiàn)1條經(jīng)驗(yàn) 獲得超3個(gè)贊
java中,方法的參數(shù)是值傳遞,在initUser方法中,將user對(duì)象的地址賦值給了initUser中參數(shù)user,現(xiàn)在他們指向同一片地址。然而,方法initUser的參數(shù)在方法中又指向了另一地址,實(shí)際的user對(duì)象的地址依舊沒(méi)變,仍然為null。

TA貢獻(xiàn)1條經(jīng)驗(yàn) 獲得超0個(gè)贊
java傳參傳入的對(duì)象其實(shí)是一個(gè)副本,相當(dāng)于你穿參開(kāi)始,就有2個(gè)user了,你改變initUser中的副本user當(dāng)然不會(huì)改變到本來(lái)的user

TA貢獻(xiàn)1條經(jīng)驗(yàn) 獲得超0個(gè)贊
java中的參數(shù)傳遞 其實(shí)相當(dāng)于一種賦值,如果是基本類(lèi)型就是直接賦值,如果是引用類(lèi)型就是把引用賦給形參,如上題,在addUser方法中 user 雖然是null,但是傳遞給initUser方法的時(shí)候他是實(shí)參,相當(dāng)于將這個(gè)實(shí)參的引用賦給了initUser方法的形參 user,說(shuō)白了 就是initUser方法的形參user指向了addUser方法里面的user(也就是指向了null),然后呢,在initUser方法里面,把形參user又指向了新的引用 new User(),這里的指向 ?和addUser方法里面的user沒(méi)有一點(diǎn)關(guān)系,那個(gè)user還是指向null

TA貢獻(xiàn)1條經(jīng)驗(yàn) 獲得超0個(gè)贊
使用對(duì)象作為參數(shù)傳遞的是對(duì)象的引用?。≈挥蠸tring作為參數(shù)例外?。?/p>
initUser(User user){
user=new User();
}
這個(gè)參數(shù)傳遞的只是null對(duì)象的引用,而user=new User()這句話已經(jīng)將user指向了一個(gè)新的對(duì)象;
且這里的user參數(shù)和外面的user是不一樣的,inituser(User user)里的user作用域就只是這個(gè)函數(shù),所以外面那個(gè)user依舊指向了一個(gè)空的實(shí)例;

TA貢獻(xiàn)3條經(jīng)驗(yàn) 獲得超0個(gè)贊
User user = null;的user 跟 initUser(User user)方法的user參數(shù)不是同一個(gè)棧上面的局部變量。
也就是方法里面只是給參數(shù)user這個(gè)局部變量賦值而已,當(dāng)initUser方法退出時(shí),參數(shù)user局部變量也就沒(méi)了。

TA貢獻(xiàn)1123條經(jīng)驗(yàn) 獲得超629個(gè)贊
initUser的參數(shù)獲得的是user對(duì)象的地址的復(fù)制,所以不會(huì)改變?cè)瓉?lái)user對(duì)象的地址
添加回答
舉報(bào)