




















































































上述程序的运行结果是:
date:date=23
b1:day=15month=7year=1983
b2:day=100month=1year=2007
显然,通过调用charge(int d)方法,date的值并没有改变,这是因为调用该方法时,java就给局部变量d分配了一个临时内存即d=date,在执行方法体的时候,d被赋值为100。但整个过程中date的值还是23,并没有改变。(这是传值调用)
但是,在调用charge1(BirthDay d)时,给局部变量d在栈内分配了个一个内存空间,这个内存空间存放的是传过来的地址,即d和b1同时指向了一个堆空间(同一变量),在执行方法体的d又被指向了另一个堆内存。但b1还是指向以前的那个堆空间,即b1的值并没有改变。(传地址调用)
同理,在调用charge2(BirthDay d)时,d和b2都指向了同一个堆内存空间,在执行方法体的时候,给d指向的day这个属性赋予了新的值。那么也就相当于b2的值改变了一样。(传地址调用)
上面通过一个例子说明了传值调用和传地址调用的区别。另外还有几点需要说明的是:
1、java语言中并没有像c++那样的显式指针,但java中的引用就相当于c++的指针。
2、new出来的对象是存放在堆内存(heap)中的,局部变量和static成员变量一样存放在栈内存(stack)中。
3、当方法中的参数为数组类型的时候,数组也是运用的传地址调用。