亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

下面這道面試不太懂啊,高人看看

下面這道面試不太懂啊,高人看看

Sace 2016-03-15 00:07:21
19行有空指針異常,這是為什么?user不是已經指向新創建的User對象了嗎?
查看完整描述

9 回答

已采納
?
子木李

TA貢獻46條經驗 獲得超27個贊

Java里只有按值傳遞,沒有按引用傳遞,之所以傳遞對象后能可改變這個對象的屬性,是因為在方法中,傳遞的是一個該對象的副本,然后這個副本指向的是該傳遞過來的對象所指向的堆內存中的對象,所以,修改了副本所指向的屬性同樣會修改原始對象的屬性,但是,當使用new時,副本和對象不再指向同一個地址,副本指向了一個新的地址,傳入的參數還是指向原來的地址,所以,樓主這題里雖然在initUser中初始化了User對象,但是只是在這個initUser中user不是空的,傳遞過來的user依然是空的,也就是并沒有初始化外面addUser函數里的user對象,所以會空指針異常

查看完整回答
6 反對 回復 2016-03-15
  • Sace
    Sace
    可不可以這么理解:在成員函數中創建的對象的生命周期僅限于在成員函數內,如果不進行return則可能會被虛擬機釋放掉?
  • Caballarii
    Caballarii
    不一定,如果函數的參數是對象數組或者list,你創建一個對象加入這個數組或者list,是可以改變數組或者list的。
  • 漆黑夜明
    漆黑夜明
    的確。
點擊展開后面1
?
慕尼黑6921937

TA貢獻1條經驗 獲得超3個贊

java中,方法的參數是值傳遞,在initUser方法中,將user對象的地址賦值給了initUser中參數user,現在他們指向同一片地址。然而,方法initUser的參數在方法中又指向了另一地址,實際的user對象的地址依舊沒變,仍然為null。

查看完整回答
3 反對 回復 2016-03-15
?
4T

TA貢獻1條經驗 獲得超0個贊

java傳參傳入的對象其實是一個副本,相當于你穿參開始,就有2個user了,你改變initUser中的副本user當然不會改變到本來的user

查看完整回答
反對 回復 2016-03-15
?
慕無忌9989543

TA貢獻1條經驗 獲得超0個贊

java中的參數傳遞 其實相當于一種賦值,如果是基本類型就是直接賦值,如果是引用類型就是把引用賦給形參,如上題,在addUser方法中 user 雖然是null,但是傳遞給initUser方法的時候他是實參,相當于將這個實參的引用賦給了initUser方法的形參 user,說白了 就是initUser方法的形參user指向了addUser方法里面的user(也就是指向了null),然后呢,在initUser方法里面,把形參user又指向了新的引用 new User(),這里的指向 ?和addUser方法里面的user沒有一點關系,那個user還是指向null

查看完整回答
反對 回復 2016-03-15
?
孤舟放逐

TA貢獻1條經驗 獲得超0個贊

使用對象作為參數傳遞的是對象的引用??!只有String作為參數例外??!

initUser(User user){

user=new User();

}

這個參數傳遞的只是null對象的引用,而user=new User()這句話已經將user指向了一個新的對象;

且這里的user參數和外面的user是不一樣的,inituser(User user)里的user作用域就只是這個函數,所以外面那個user依舊指向了一個空的實例;


查看完整回答
反對 回復 2016-03-15
  • wswzh0329
    wswzh0329
    http://www.xianlaiwan.cn/wenda/detail/311760 幫我看看介個 關于匿名內部類的問題 謝謝!
?
20091807

TA貢獻3條經驗 獲得超0個贊

User user = null;的user 跟 initUser(User user)方法的user參數不是同一個棧上面的局部變量。

也就是方法里面只是給參數user這個局部變量賦值而已,當initUser方法退出時,參數user局部變量也就沒了。

查看完整回答
反對 回復 2016-03-15
  • Sace
    Sace
    我覺得是和new的過程有關吧,因為在同樣的init方法中如果傳入一個單例對象的話,是可以進行操作的(就是劃掉26行)
  • kokoromi
    kokoromi
    就你說的是對的,Java中只有值傳遞,user傳進來后會被復制一個副本,而這個副本和原來的user位于棧中的不同位置,方法中的副本user存儲的是 new User()對象在堆中的地址,而原來的處于棧中的另一個位置的user存儲的依然是原來的null。
?
風塵之魂

TA貢獻5條經驗 獲得超1個贊

不是有個=null寫的很清楚啊 ?自然就是空指針了。

查看完整回答
反對 回復 2016-03-15
?
Caballarii

TA貢獻1123條經驗 獲得超629個贊

initUser的參數獲得的是user對象的地址的復制,所以不會改變原來user對象的地址

查看完整回答
反對 回復 2016-03-15
?
badbomb

TA貢獻16條經驗 獲得超10個贊

只是傳值,沒有傳地址

查看完整回答
反對 回復 2016-03-15
  • 9 回答
  • 5 關注
  • 2586 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號