如何在Java中交换两个对象参数的引用
先看一下Java中的求值策略
- 传值调用(值传递)
- 在传值调用中,实际参数先被求值,然后其值通过复制,被传递给被调函数的形式参数。因为形式参数拿到的只是一个"局部拷贝",所以如果在被调函数中改变了形式参数的值,并不会改变实际参数的值。
- 传引用调用(引用传递)
- 在传引用调用中,传递给函数的是它的实际参数的隐式引用而不是实参的拷贝。因为传递的是引用,所以,如果在被调函数中改变了形式参数的值,改变对于调用者来说是可见的。
以上是值传递和引用传递的定义,我们都知道在Java中总是按值传递的。
交换两个对象参数的引用
交换成员:如果我们知道Employee类中只有一个整型的成员变量age,那么我们可以交换成员变量的值来实现
public class Employee {
int age;
Employee(int age){
this.age = age;
}
}
class Main {
public static void swap(Employee a, Employee b) {
int tmp = a.age;
a.age = b.age;
b.age = tmp;
}
public static void main(String[] args) {
Employee employee1 = new Employee(18);
Employee employee2 = new Employee(81);
swap(employee1,employee2);
System.out.println("employee1.age = "+employee1.age);
System.out.println("employee2.age = "+employee2.age);
}
}
employee1.age = 81
employee2.age = 18
如果我们不知道Employee类中的成员呢?
如下
public class Employee {
int age;
String name;
Employee(int age,String name){
this.age = age;
this.name = name;
}
void print() {
System.out.println("age ="+age+",name ="+name);
;
}
}
class Main {
public static void swap(Employee a, Employee b) {
Employee tmp = a;
a = b;
b = tmp;
}
public static void main(String[] args) {
Employee employee1 = new Employee(18,"zhangsan");
Employee employee2 = new Employee(81,"lisi");
swap(employee1,employee2);
employee1.print();
employee2.print();
}
}
result:
age =18,name =zhangsan
age =81,name =lisi
之前我们讨论过在Java中总是按值传递的,所以在调用swap(Employee a, Employee b)时,a和b拿到的是employee1和employee2的地址的拷贝,它们仅仅交换了a和b的地址而在退出方法时a,b两个变量随之废弃,因此并未对employee1和employee2产生影响。
使用包装类解决此问题
public class Employee {
int age;
String name;
Employee(int age,String name){
this.age = age;
this.name = name;
}
void print() {
System.out.println("age ="+age+",name ="+name);
;
}
}
class Wrapper {
Employee c;
Wrapper(Employee c) {
this.c = c;
}
}
class Main {
public static void swap(Wrapper a, Wrapper b) {
Employee tmp = a.c;
a.c = b.c;
b.c = tmp;
}
public static void main(String[] args) {
Employee employee1 = new Employee(18,"zhangsan");
Employee employee2 = new Employee(81,"lisi");
Wrapper wrapper1 = new Wrapper(employee1);
Wrapper wrapper2 = new Wrapper(employee2);
swap(wrapper1,wrapper2);
wrapper1.c.print();
wrapper2.c.print();
}
}
result:
age =81,name =lisi
age =18,name =zhangsan
可以成功交换
评论区