侧边栏壁纸
博主头像
qingtian博主等级

喜欢是一件细水流长的事,是永不疲惫的双向奔赴~!

  • 累计撰写 104 篇文章
  • 累计创建 48 个标签
  • 累计收到 1 条评论

如何在Java中交换两个对象参数的引用

qingtian
2020-10-31 / 0 评论 / 0 点赞 / 1,601 阅读 / 2,788 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2020-11-09,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

如何在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

可以成功交换

0

评论区