6 回答

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超6個(gè)贊
是時(shí)候展現(xiàn)一下我的JAVA基礎(chǔ)知識(shí)了,2333。
我按照?qǐng)?zhí)行順序給你寫注釋好了。
Person p1 = new Person(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 = new Person(20);
//注意,這里!這里!
//這里是p被重新賦值了,p指向了新的對(duì)象new Person(20);
//p.age=20;
//和p1指向的那個(gè)對(duì)象一毛線關(guān)系都沒有啊
所以,你的代碼是在函數(shù)內(nèi)部,把局部變量給重新賦值了。
是沒法修改到外面的對(duì)象的,因?yàn)槟阋呀?jīng)把唯一能訪問(wèn)到外面那個(gè)p1的p給重新賦值了!
public static void modify(Person p){
p.age=20; //只有這樣才能修改對(duì)象!
}
同理,如果你寫成這樣:
public static void modify(Person p){
p = null;//對(duì)外面的p1沒有任何影響
}
我舉個(gè)例子,你就比較好理解了。
你創(chuàng)建了一個(gè)100000000個(gè)元素的數(shù)組,比如就叫p1,你把數(shù)組通過(guò)參數(shù)傳進(jìn)函數(shù)里面,那么:
這個(gè)參數(shù)p(類似于p = p1),p和p1他們是指向同一個(gè)對(duì)象。
不是說(shuō)modify(int[] p)重新創(chuàng)建了100000000個(gè)元素的數(shù)組。
這個(gè)應(yīng)該很好理解。
那么:
然后你通過(guò)p的內(nèi)置函數(shù)怎么操作p都行,都是操作的那100000000個(gè)元素的數(shù)組。
但是,你不能把p重新賦值啊。
重新賦值它就不是之前那個(gè)數(shù)組啦!
比如:
你重新p = new int[100000000],就創(chuàng)建了一個(gè)新的100000000個(gè)元素的數(shù)組啊。
你執(zhí)行p = null,也只是銷毀了這個(gè)引用,不讓它指向100000000個(gè)元素的數(shù)組而已。
對(duì)外面p1的那個(gè)數(shù)組不會(huì)再有任何影響了。
看到答案里好多人對(duì)這個(gè)有誤解額。。。
說(shuō)不是一個(gè)對(duì)象的。
說(shuō)不能在函數(shù)里改變參數(shù)指向的對(duì)象的。
說(shuō)int是傳值的。
說(shuō)什么的都有,2333。
補(bǔ)充:
關(guān)于JAVA的函數(shù)傳參數(shù),你應(yīng)該也聽說(shuō)過(guò),所謂"基本數(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ù)外面)。

TA貢獻(xiàn)1773條經(jīng)驗(yàn) 獲得超3個(gè)贊
首先你得知道什么是值傳遞和引用傳遞。引用傳遞本身其實(shí)是傳遞內(nèi)存地址,即一個(gè)數(shù)字。而數(shù)字這樣的基本類型傳遞是復(fù)制傳遞,即拷貝一個(gè)值從實(shí)參到形參,兩者改變互不影響。
public class TestMain {
public static void main(String[] args) {
Person p1 = new Person(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)
}
public static void modify(Person p){
p = new Person(20); // 3. 假設(shè)這里的Person(20)的內(nèi)存地址為01010,然后賦值給了p。但是由于p是上面p1的一個(gè)拷貝,p的改變不影響p1,因此函數(shù)結(jié)束后p1依舊是01002
// 5. 但是這里如果是類似p.setAge()這樣的話,由于并沒有改變引用值(即地址),所以這里的操作是去改變p1指向的對(duì)象
}
}

TA貢獻(xiàn)1812條經(jīng)驗(yàn) 獲得超5個(gè)贊
其實(shí)p = new Person(20)是重新開辟了一個(gè)內(nèi)存地址,跟原來(lái)的那個(gè)p1沒有任何的關(guān)系了。如果是
public static void modify(Person p){
p.age=20;
}
這樣結(jié)果就是20了。

TA貢獻(xiàn)1883條經(jīng)驗(yàn) 獲得超3個(gè)贊
public static void main(String[] args) {
Person p1 = new Person(10); //此處調(diào)用的是構(gòu)造方法 直接執(zhí)行出age=10的結(jié)果
modify(p1);
System.out.println(p1);
}
你要想出age=20的結(jié)果 應(yīng)該這樣
public class testFromWeb01 {
public static void modify(Person p){ //使用此函數(shù)修改引用的指向
p = new Person(20);
System.out.println(p); //修改在這里?。。。?!
}
public static void main(String[] args) {
Person p1 = new Person(10);
modify(p1); //修改p1引用的對(duì)象
}
}
添加回答
舉報(bào)