java的參數(shù)傳遞與內(nèi)存分配問(wèn)題
來(lái)源:程序員人生 發(fā)布時(shí)間:2015-03-09 08:52:43 閱讀次數(shù):3359次
本文可作為北京尚學(xué)堂java課程的學(xué)習(xí)筆記。
看下面這段代碼。
class BirthDate {
private int day;
private int month;
private int year;
public BirthDate(int d, int m, int y) {
day = d;
month = m;
year = y;
}
//省略get set
public void display() {
System.out.println
(day + " - " + month + " - " + year);
}
}
public class Test{
public static void main(String args[]){
Test test = new Test();
int date = 9;
BirthDate d1= new BirthDate(7,7,1970);
BirthDate d2= new BirthDate(1,1,2000);
test.change1(date);
test.change2(d1);
test.change3(d2);
System.out.println("date=" + date);
d1.display();
d2.display();
}
public void change1(int i){
i = 1234;
}
public void change2(BirthDate b) {
b = new BirthDate(22,2,2004);
}
public void change3(BirthDate b) {
b.setDay(22);
}
}
結(jié)果以下:
date=9
7 - 7 - 1970
22 - 1 - 2000
我自己不明白的是change2這個(gè)方法,它居然沒(méi)有改變d1的值!
其實(shí)我們想一想也就明白了,在change2運(yùn)行的時(shí)候,棧內(nèi)存中又多了1塊區(qū)域,寄存局部變量b。在change2運(yùn)行時(shí),b首先指向?qū)崊1的位置。也就是7⑺⑴970 而后new 了1個(gè)新的birthday,假定它在堆內(nèi)存的地址為5421 那末b的值改成了5421 等change2這個(gè)方法結(jié)束的時(shí)候,b這塊內(nèi)存也就消失了。d1自然甚么都不變嘍。
再看change3
運(yùn)行這個(gè)方法的時(shí)候,b首先指向的也是實(shí)參d2的位置。我們直接通過(guò)b修改了那塊內(nèi)存的數(shù)據(jù),那末d2這個(gè)變量的值自然也就改變了。
生活不易,碼農(nóng)辛苦
如果您覺(jué)得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)