JAVA如何使用函数进行值交换

熟悉C/C++的朋友一定知道参数传递大致有值传递,引用传递,指针的方式也可以看做是值传递

因此在C/C++中,想要交换两个参数的值我们可以使用引用传递,或者直接使用指针,就可以实现

例如:

void swap1(int& a,int& b){
    int temp=a;
    a=b;
    b=temp;
}//引用传递


void swap2(int* a,int* b){
    int temp=*a;
    *a=*b;
    *b=temp;
}//使用指针

但是在java当中,只存在值传递这就导致了如下的写法是失败的,因为值传递,函数中只保留实参的副本,不会导致原来的参数的值发生变化

public void swap(int a,int b){
    int temp=a;
    a=b;
    b=temp;
}//交换失败

但是有时候我们又会发现,java中是可以导致值的改变的,例如:

class Test{
    int a;

    public Test() {
    }

    public Test(int a) {
        this.a = a;
    }

    public int getA() {
        return a;
    }

    public void setA(int a) {
        this.a = a;
    }

    @Override
    public String toString() {
        return "Test{" +
                "a=" + a +
                '}';
    }
}
public class Main {
    public static void main(String[] args) {
        Test a=new Test(6);
        Test b=new Test(7);
        change(a);
        System.out.println(a);
    }
    public static void change(Test a){
        a.setA(59);
    }
}

这是为什么呢?

java中虽然是值传递,但是java的对象内部保存的值其实是地址值,我们知道java中通过new创建的对象是保存在堆空间中,堆空间中的变量不会随着函数的结束而销毁,因此,虽然进行的是值传递,但是依然可以修改对象的值。

我们可能联想到,既然对象保存的是地址,那么不用int,改用包装类型Interger可不可以实现交换呢?

很遗憾,依然不能这样交换,原因是:

翻看Integer源代码可以发现

    /**
     * The value of the {@code Integer}.
     *
     * @serial
     */
    private final int value;

Integer中保存的值是value这个常量,也就是说不能修改Integer内部保存的值

然而我们实际应用过程中好像是可以修改的,原因如下:

void test(){
    Integer a=6;
    a=100;//a的值变为了100,但是本质不是修改a的值,而是新建了一个Integer,把这个新变量的值赋给了a
}

综上,我们也不能通过Integer实现数值的交换,那么如何实现像C/C++那样的数值交换呢?

大概只有通过封装自己的类,然后通过get,set方法才能实现了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值