java編程,函數(shù)內(nèi)變量傳遞問(wèn)題,為什么沒(méi)有都改變呢?
問(wèn)題描述
代碼如下:
public void test(BSTNode<T> z) {BSTNode<T> y;if (z.left != null){ y = z.parent; BSTNode<T> a; a = y.left; if (y != null){System.out.println('before a '+a);System.out.println('before y.left'+y.left);System.out.println('befere z.parent.left '+z.parent.left);y.left = null;//a = null;System.out.println('after a '+a);System.out.println('after y.left '+y.left);System.out.println('after z.parent.left '+z.parent.left); }} }
打印結(jié)果如下:before a threadSleep.BSTree$BSTNode@15db9742before y.leftthreadSleep.BSTree$BSTNode@15db9742befere z.parent.left threadSleep.BSTree$BSTNode@15db9742after a threadSleep.BSTree$BSTNode@15db9742after y.left nullafter z.parent.left null
請(qǐng)問(wèn) “after a ”為什么不是null?
或者將代碼:
y.left = null;
//a = null;
改為
//y.left = null;
a = null;
結(jié)果為:
before a threadSleep.BSTree$BSTNode@15db9742
before y.leftthreadSleep.BSTree$BSTNode@15db9742
befere z.parent.left threadSleep.BSTree$BSTNode@15db9742
after a threadSleep.BSTree$BSTNode@15db9742
after y.left null
after z.parent.left null
運(yùn)行環(huán)境:
jdk1.8
問(wèn)題解答
回答1:你的結(jié)果兩次肯定不一樣。其實(shí)就和下面這種是一樣的。
int x = 10;int y = x;y = 0;x ?回答2:
Java中所說(shuō)的按引用傳遞實(shí)質(zhì)上是傳遞該對(duì)象的地址,該地址其實(shí)是按值傳遞的,通過(guò)這個(gè)地址可以修改其指向內(nèi)存處對(duì)象的值。改變?cè)摰刂返闹岛翢o(wú)意義,只會(huì)失去對(duì)真實(shí)對(duì)象的掌控。
回答3:我來(lái)我來(lái)
很簡(jiǎn)單,你只要理解,引用傳遞傳遞的是一個(gè)地址,這個(gè)地址傳過(guò)去之后會(huì)放在被調(diào)用方法的本地變量變中,兩個(gè)方法就有兩個(gè)棧幀,每個(gè)棧幀都有自己的本地變量表,互不影響。所以這就是你傳個(gè)引用過(guò)去,然后改變了引用的指向?qū)υ瓉?lái)沒(méi)有形象的原因。
那么,為啥obj.val被修改的時(shí)候,val的值會(huì)改變呢,因?yàn)関al的值是存在堆中的,他被復(fù)制過(guò)來(lái),修改,然后又寫回去堆中,所以就更改了。不明白可以繼續(xù)提問(wèn)
相關(guān)文章:
