今儿读了一篇文章,有关值传递和引用传递的。
我们总认为引用传递就是变量名的赋值,因为往往变量名的值就是这个变量所占的地址。
然而,地址有很多种,我们看一下这个例子(引自文章):
public class Employee {
public String name=null;
public Employee(String n){
this.name=n;
}
//将两个Employee对象交换
public static void swap(Employee e1,Employee e2){
Employee temp=e1;
e1=e2;
e2=temp;
System.out.println(e1.name+" "+e2.name); //打印结果:李四 张三
}
//主函数
public static void main(String[] args) {
Employee worker=new Employee("张三");
Employee manager=new Employee("李四");
swap(worker,manager);
System.out.println(worker.name+" "+manager.name); //打印结果仍然是: 张三 李四
}
}
文章说道:实际的交换没有成功的原因是,形参的变量地址是实参变量地址的拷贝,虽然他们的地址值是一样的,但是!
形参和实参的内存地址并不一样。因为在JVM运行上面代码时,会在java栈中分别push两个帧栈的内存空间分别存储两个方法的变量中的地址。所以虽然他们的地址值一样,但是内存地址并不一样。所以,区分值传递还是引用传递,根本是看他们所占的内存空间是否一样,注意是内存地址!
参考文章链接:
http://hxraid.iteye.com/blog/428856