我们知道方法传递有值传递、引用传递、名称传递。
而在java中,是统一的值传递,是一个值的拷贝。
对于原始类型,传递方法参数就是这个具体值。所以在方法里面改变这个值是不影响方法调用时的地方值。
而对于对象类型,是一个引用的拷贝。我们可以看下面的例子。
首先,我们定义一个Employee类。
class Employee{
public Employee(int s){
this.salary = s;
}
private int salary;
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
}
然后,写一个调用方法:
public static void main(String[] args) {
Employee a = new Employee(4);
Employee b = new Employee(5);
System.out.println("employee a salary:"+a.getSalary());
System.out.println("employee b salary:"+b.getSalary());
swap(a, b);
System.out.println("employee a salary:"+a.getSalary());
System.out.println("employee b salary:"+b.getSalary());
}
public static void swap(Employee x,Employee y){
Employee temp = x;
x = y;
y = temp;
}
仔细看以上程序,我们预估员工a和员工b交换了。
但真实是这样的吗?
运行一下。
运行后的结果,
employee a salary:4
employee b salary:5
employee a salary:4
employee b salary:5
发现没有a和b并没有交换。
这是为什么?
如果用指针的概念就比较好理解了。
对于Employee a = new Employee(4);
,这里的a实际上并不是真正的对象本身,它只是一个引用。当把a
传给swap
方法时,拷贝的是a
本身即这个引用值。
所以,在swap
方法里,交换的都是引用值的拷贝,对于对象本身来讲,是没有任何影响的。
既然是这样,我们如果要改变a
引用真正对象的值。我们可以这样。
public static void main(String[] args) {
Employee a = new Employee(4);
System.out.println("employee a salary:"+a.getSalary());
setSalary(a);
System.out.println("employee a salary:"+a.getSalary());
}
public static void setSalary(Employee e){
e.setSalary(500);
}
这样的话,虽然传进去的是对象a
的引用值拷贝,但是引用的位置是对的啊。这样参考引用去改变对象的值,是可以成功的。
可以看下结果:
employee a salary:4
employee a salary:500
这样就是没问题的。
不知道,我解释的是不是够明白。如果文章被你看到了,可以给个反馈。^-^