程序员人生 网站导航

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

栏目:php教程时间:2015-03-09 08:52:43
本文可作为北京尚学堂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运行的时候,栈内存中又多了1块区域,寄存局部变量b。在change2运行时,b首先指向实参d1的位置。也就是7⑺⑴970 而后new 了1个新的birthday,假定它在堆内存的地址为5421 那末b的值改成了5421 等change2这个方法结束的时候,b这块内存也就消失了。d1自然甚么都不变喽。

再看change3
运行这个方法的时候,b首先指向的也是实参d2的位置。我们直接通过b修改了那块内存的数据,那末d2这个变量的值自然也就改变了。

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐