Java的值传递or址传递?

关于值传递和址传递在Java中老是存在疑惑,网上帖子有说Java不存在址传递,也有人说Java二者都有。下面验证一下。

经典函数SWAP(交换函数):

关于交换函数大家都学过,在学C系列语言时,专门用来讲解址和值的区别.

void swap(int a,int b){
   int temp = a;
      a = b;
      b= temp;
}
public void main(String [] args){
    int fir = 5;
    int sec = 10;
    swap(fir,sec);
    system.out.print(fir+"  "+sec);
} 

运行代码可知道,输出结果是这2个数并没有交换,因为swap函数运行时,会创建2个关于fir和sec的副本,然后函数结束时,a和b会和函数一起消亡,所以回到main函数输出时,还是输出原来初始化的值.

常见操作

在Java中,大部分时候都是操作对象,有些函数就是用来修改对象的内容的。

void change(Person p){
 p.setName("饿了么");
 p.setAge (20);
}
public void main(String[] args){
 Person per = new Person();
  per.setName("美团");
  per.setAge (40);
  change(per);
   system.out.print(per.getName()+"   "+per.getAge());  
}

运行代码可知道,结果是改变了的,不再是初始化的值了。这代表Java存在址传递???我们在看下面一段代码。

void change(Person p){
 p = new Person();//多加的一行代码
 p.setName("饿了么");
 p.setAge (20);
}
public void main(String[] args){
 Person per = new Person();
  per.setName("美团");
  per.setAge (40);
  change(per);
   system.out.print(per.getName()+"   "+per.getAge());  
}

运行结果可以知道,结果并没有改变。2者对比解析,如果是址传递的,那么下面这段代码change函数中的p和per应该还是会指向同一块区域,也就是change函数中new出来的区域,结果应该一致。如果是值传递,那么上面那段代码又确实修改了per的内容.

其实运行时,会将per在栈空间的值复制一份作为change的参数p,然后对p进行操作。然而在堆中的空间,也就是per指向的那块区域,并没有复制一份,所以修改p指向的空间,也会修改per指向的空间。下面那段代码,将p重新指向另一块区域,因为p只是per的副本,所以per还是指向初始化的那块空间,接下来对p指向的新空间进行修改,显然不会修改到per指向的空间.

所以说,Java中不存在址传递!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值