举例说明:传值引用与传地址引用的区别

 

class  BirthDay {

     
private int day;
     
private int month;
     
private int year;
     
     BirthDay(
int d,int m,int y){        
         day
=d;
         month
=m;
         year
=y;         
     }
 
     
     
public void setDay(int d){
         
         day
=d;
         
     }

     
      
public void setMonth(int m){
         
         month
=m;
         
     }

     
      
public void setYear(int y){
         
         year
=y;
         
     }

     
     
public void display(BirthDay b){
         
         System.out.println(
"day="+b.day+"month="+b.month+"year="+b.year);
         }

}


public   class  BirthDayTest {

     
    
public void charge(int b){
        b
=100;
    }

    
    
public void charge1(BirthDay b){
        b
=new BirthDay(23,3,2007);
    }

    
    
public void charge2(BirthDay b){
        b.setDay(
100);
    }

    
    
public static void main(String args[]){
        
        BirthDayTest test
=new BirthDayTest();
        
        
int Date=23;
    
        BirthDay b1
=new BirthDay(15,7,1983);
    
        BirthDay b2
=new BirthDay(20,1,2007);
        
        test.charge(Date);
        System.out.println(
"date="+Date);
        test.charge1(b1);
        b1.display(b1);       
        test.charge2(b2);
        b2.display(b2);
        
        
        
        }

    
   
}

     上述程序的运行结果是:

       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、当方法中的参数为数组类型的时候,数组也是运用的传地址调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值