第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

java中引用傳遞問題,在函數(shù)中修改引用的指向,會(huì)不會(huì)影響實(shí)參?

java中引用傳遞問題,在函數(shù)中修改引用的指向,會(huì)不會(huì)影響實(shí)參?

紫衣仙女 2019-04-21 20:14:44
publicclassTestMain{publicstaticvoidmain(String[]args){Personp1=newPerson(10);modify(p1);//修改p1引用的對(duì)象System.out.println(p1);}publicstaticvoidmodify(Personp){//使用此函數(shù)修改引用的指向p=newPerson(20);}}classPerson{//實(shí)驗(yàn)用類publicintage;@OverridepublicStringtoString(){return"Person[age="+age+"]";}publicPerson(intage){this.age=age;}}輸出結(jié)果什么是Person[age=10]不應(yīng)該是Person[age=20]么?
查看完整描述

2 回答

?
拉丁的傳說

TA貢獻(xiàn)1789條經(jīng)驗(yàn) 獲得超8個(gè)贊

是時(shí)候展現(xiàn)一下我的JAVA基礎(chǔ)知識(shí)了,2333。我按照執(zhí)行順序給你寫注釋好了。
Personp1=newPerson(10);
//創(chuàng)建了一個(gè)對(duì)象
//p1.age=10;
modify(p1);
//modify函數(shù)傳參,創(chuàng)建了一個(gè)在modify函數(shù)里面的局部變量p
//你應(yīng)該明白p是一個(gè)新的變量,這里類似于執(zhí)行了p=p1,這兩個(gè)是指向的同一個(gè)對(duì)象的
//p.age=10;
p=newPerson(20);
//注意,這里!這里!
//這里是p被重新賦值了,p指向了新的對(duì)象newPerson(20);
//p.age=20;
//和p1指向的那個(gè)對(duì)象一毛線關(guān)系都沒有啊
所以,你的代碼是在函數(shù)內(nèi)部,把局部變量給重新賦值了。是沒法修改到外面的對(duì)象的,因?yàn)槟阋呀?jīng)把唯一能訪問到外面那個(gè)p1的p給重新賦值了!
publicstaticvoidmodify(Personp){
p.age=20;//只有這樣才能修改對(duì)象!
}
同理,如果你寫成這樣:
publicstaticvoidmodify(Personp){
p=null;//對(duì)外面的p1沒有任何影響
}
我舉個(gè)例子,你就比較好理解了。你創(chuàng)建了一個(gè)100000000個(gè)元素的數(shù)組,比如就叫p1,你把數(shù)組通過參數(shù)傳進(jìn)函數(shù)里面,那么:這個(gè)參數(shù)p(類似于p=p1),p和p1他們是指向同一個(gè)對(duì)象。不是說modify(int[]p)重新創(chuàng)建了100000000個(gè)元素的數(shù)組。這個(gè)應(yīng)該很好理解。
那么:然后你通過p的內(nèi)置函數(shù)怎么操作p都行,都是操作的那100000000個(gè)元素的數(shù)組。但是,你不能把p重新賦值啊。重新賦值它就不是之前那個(gè)數(shù)組啦!
比如:你重新p=newint[100000000],就創(chuàng)建了一個(gè)新的100000000個(gè)元素的數(shù)組啊。你執(zhí)行p=null,也只是銷毀了這個(gè)引用,不讓它指向100000000個(gè)元素的數(shù)組而已。對(duì)外面p1的那個(gè)數(shù)組不會(huì)再有任何影響了。
看到答案里好多人對(duì)這個(gè)有誤解額。。。說不是一個(gè)對(duì)象的。說不能在函數(shù)里改變參數(shù)指向的對(duì)象的。說int是傳值的。說什么的都有,2333。
補(bǔ)充:關(guān)于JAVA的函數(shù)傳參數(shù),你應(yīng)該也聽說過,所謂"基本數(shù)據(jù)類型是傳遞的值,其它都是傳遞的引用"。個(gè)人理解是這樣的。你傳遞個(gè)Person的對(duì)象進(jìn)去,你可以用SetAge()什么的修改這個(gè)對(duì)象。但是基本的數(shù)據(jù)類型,比如Integer、String等等,他們沒有什么內(nèi)置函數(shù)能改變他們自己。所以,你傳遞進(jìn)去一個(gè)int的參數(shù),就算其實(shí)是傳遞的引用,你也只能對(duì)int做重新賦值,一重新賦值,就表現(xiàn)成傳遞的是"值"(永遠(yuǎn)影響不到函數(shù)外面)。
                            
查看完整回答
反對(duì) 回復(fù) 2019-04-21
?
千巷貓影

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超7個(gè)贊

首先你得知道什么是值傳遞和引用傳遞。引用傳遞本身其實(shí)是傳遞內(nèi)存地址,即一個(gè)數(shù)字。而數(shù)字這樣的基本類型傳遞是復(fù)制傳遞,即拷貝一個(gè)值從實(shí)參到形參,兩者改變互不影響。
publicclassTestMain{
publicstaticvoidmain(String[]args){
Personp1=newPerson(10);//1.假設(shè)這里的Person(10)對(duì)象保存的內(nèi)存地址為:01002
modify(p1);//2.將01002地址傳入,將復(fù)制01002給實(shí)參,但是p1還是01002
System.out.println(p1);//4.打印出p1(01002)指向的對(duì)象,則還是之前的Person(10)
}
publicstaticvoidmodify(Personp){
p=newPerson(20);//3.假設(shè)這里的Person(20)的內(nèi)存地址為01010,然后賦值給了p。但是由于p是上面p1的一個(gè)拷貝,p的改變不影響p1,因此函數(shù)結(jié)束后p1依舊是01002
//5.但是這里如果是類似p.setAge()這樣的話,由于并沒有改變引用值(即地址),所以這里的操作是去改變p1指向的對(duì)象
}
}
                            
查看完整回答
反對(duì) 回復(fù) 2019-04-21
  • 2 回答
  • 0 關(guān)注
  • 662 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)