Java 交换两个变量的数值

一、参数传递方法

为解决标题问题,首先介绍参数传递方法。目前各类程序设计语言的参数传递方法主要有三种:

  1. 按值传递
  2. 按引用传递
  3. 按指针传递

其中按值传递表示方法(函数)接收的是调用者提供的变量的拷贝,不改变参数的值;按引用传递表示方法(函数)接收的调用者提供的变量地址;按指针传递表示方法(函数)接收的是调用者提供的指针的拷贝,不改变指针的值和地址,但可以改变指针所指向的地址。

二、Java参数传递方法

Java提供的参数传递方法,很遗憾只有一种,按值传递。也就是说,方法得到的是所有参数值的一个拷贝,方法不能修改传递给它的参数变量的内容。

Java的方法参数类型可以分为两类:

  1. 基本数据类型
  2. 对象引用

有过Java开发经验的朋友都知道,对于基本数据类型,Java方法无法改变变量内容。那对自定义类的对象引用是否也不能修改内容呢?可以通过一个简单的例子说明。代码如下:

 

public class MyClass{
    private Object num;

    public MyClass(Object num){
        this.num=num;
    }
    
    public Object getNum() {
        return num;
    }

    public void setNum(Object num) {
        this.num = num;
    }
}

 

public class Main {
    
    public static void change(MyClass myClass){
        myClass.setNum(100);
    }
    
    
    
    public static void main(String[] args){
        MyClass a=new MyClass(10);
        System.out.println("调用change方法前的值为:"+a.getNum());
        change(a);
        System.out.println("调用change方法后的值为:"+a.getNum());
    }
    
}

上面代码执行输出结果如下:

 

 

 

从结果中可以看出,change方法能够修改对象的状态。也就是说Java方法可以改变对象的参数状态。那这是否意味着Java方法对于自定义的数据类型(自定义类)的参数采用的是引用传递?为了确认结果可以编写个简单例子,所有的自定义类仍然是上面的MyClass。代码如下:

public static void swap(MyClass a,MyClass b){
        MyClass tmp=a;
        a=b;
        b=tmp;
    }
    
    public static void main(String[] args){
        MyClass a=new MyClass(10);
        MyClass b=new MyClass(100);
        System.out.println("交换之前a的值为:"+a.getNum());
        System.out.println("交换之前b的值为:"+b.getNum());
        swap(a,b);
        System.out.println("交换之后a的值为:"+a.getNum());
        System.out.println("交换之后b的值为:"+b.getNum());
    }
}

执行结果如下:

通过上面结果可以发现,Java方法对自定义类的参数传递使用的仍然是值传递,不是引用传递。那为什么Java方法能够修改对象状态呢?

可以考虑调用change方法的具体执行过程,从中寻找答案。

调用change方法事,具体的执行过程是:

  1. myClass被初始化成实参a的copy,这是对对象的引用。
  2. setNum方法应用于这个对象的引用。myClass和a同时引用的那个MyClass对象的num变为了100。
  3. 方法结束后,参数变量myClass不再使用。而a继续引用那个num变为100的MyClass对象。如下图所示。

所以,Java方法能够实现改变对象参数状态的原因是:方法得到的是对象引用的拷贝,对象引用及方法中的其他拷贝同时引用同一个对象。

现在,总结一下Java的方法参数使用:

  • 方法不能修改一个基本数据类型的参数;
  • 方法可以改变对象参数的状态;
  • 方法不能让对象参数引用一个新的对象(原因参考调用change方法时的具体执行过程)。

三、交换变量的数值

既然已经知其所以然,那么知其然就不是难事了。直接贴出我的个人代码:

 

public static void swap(MyClass a,MyClass b){
        Object tmp=a.getNum();
        a.setNum(b.getNum());
        b.setNum(tmp);
}

 

执行结果如下:

交换有效。

参考文献:Java核心技术 卷Ⅰ。

 

转载于:https://www.cnblogs.com/xiuyangleiasp/p/4936665.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值