关于值传递和址传递在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中不存在址传递!!!!