您的位置:首页 > 编程语言 > Java开发

java的参数传递与内存分配问题

2015-03-04 21:09 423 查看
本文可作为北京尚学堂java课程的学习笔记。

看下面这段代码。

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);
}
}


结果如下:

date=9

7 - 7 - 1970

22 - 1 - 2000

我自己不明白的是change2这个方法,它竟然没有改变d1的值!

其实我们想想也就明白了,在change2运行的时候,栈内存中又多了一块区域,存放局部变量b。在change2运行时,b首先指向实参d1的位置。也就是7-7-1970 而后new 了一个新的birthday,假定它在堆内存的地址为5421 那么b的值改成了5421 等change2这个方法结束的时候,b这块内存也就消失了。d1自然什么都不变喽。

再看change3

运行这个方法的时候,b首先指向的也是实参d2的位置。我们直接通过b修改了那块内存的数据,那么d2这个变量的值自然也就改变了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: