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核心技术 卷Ⅰ。

时间: 2024-11-05 00:46:32

Java 交换两个变量的数值的相关文章

简单的交换两个变量的数值

//给定两个整数,利用交换函数交换两个数的内容#include <stdio.h>void swap(int *x,int *y);/*函数声明*/int main (){ int a; int b; printf("请分别输入a.b的值\n"); printf("a="); scanf("%d",&a); printf("b="); scanf("%d",&b); swap(&

JavaSE7基础 交换两个变量的数值 巧妙的代码

jdk版本  :jdk-7u72-windows-i586系统     :Windows7编辑器   :Notepad++ v7.4.2注意事项 :博文内容仅供参考,不可用于其他用途. 代码 class Demo{ public static void main(String[] args){ int a=10; int b=20; //一句话搞定 两数的交换 b=(a+b)-(a=b) ; /* 运算顺序 1 (a+b) 2 (a=b) 3 30-20 */ //一行代码呀,还是提醒一下大家

JAVA不用临时变量交换两个变量的值

交换两个变量的值,不适用临时变量 1 public class Test{ 2 public static void main(String[] args){ 3 int a = 1; 4 int b = 2; 5 // 请交换两个变量的值 6 } 7 } 交换两变量的值 加减实现交换 1 public class Test{ 2 public static void main(String[] args){ 3 int a = 1; 4 int b = 2; 5 // 请交换两个变量的值 6

【Java】不使用第三方变量交换两个变量的值

在语言学习和进行程序设计的时候,我们交换两个变量最常使用的方法是借助temp这个新的变量进行转换,代码如下: ----------------------------------------- <--标准算法--> ----------------------------------------- int a = 3, b = 4; int temp = a; a = b; b = temp; ----------------------------------------- 这种方法易于理解

不用新的变量,交换两个变量的值。

不用新的变量,交换两个变量的值.比如有2个变量a , b ,我们希望交换他们的值. 下面介绍两种不同的解法: 第一种:基于加减法 a = a + b ;   //先让a等于和 b = a - b ;  //和减去原来b的值得到原来a的值,赋值给b a = a - b : //和减去改变后b的值(原来a的值)得到原来b的值,赋值给a 第二种:基于异或运算 a = a ^ b  // 先a异或上b,赋值给a b = a ^ b  // a异或上b,消去b的影响得到原来的a,赋值给b a = a ^

PHP中不用第三个变量交换两个变量的值

相信大家在PHP面试或者学习中经常会遇到这个问题就是“不用第三个变量来交换两个变量的值”,今天正对这个问题来讨论一下: 第一种方法:首先会想到的 这种方法简单可行,顺利的交换了两个变量的值. 第二种方法呢,稍加思考我们就会用到PHP中的函数来实现 第三种方法呢,我们来采用PHP中提供各种字符串分割函数来实现. 简单的题目不同的思想就会有不同的解法,期待更多的答案.

不用第三方变量交换两个变量的值

1.这需要进行位操作,必较麻烦的在学习程序语言和进行程序设计的时候,交换两个变量的值是经常要使用的.通常我们的做法是(尤其是在学习阶段):定义一个新的变量,借助它完成交换.代码如下: int a,b; a=10; b=15; int t; t=a; a=b; b=t; 这种算法易于理解,特别适合帮助初学者了解计算机程序的特点,是赋值语句的经典应用.在实际软件开发当中,此算法简单明了,不会产生歧义,便于程序员之间的交流,一般情况下碰到交换变量值的问题,都应采用此算法(以下称为标准算法). 上面的算

由[交换两个变量的值问题]理解程序的时空复杂度

由一个编程经典问题,交换两个变量的值入手,理解程序的时空复杂度(以下均使用PHP代码演示问题的解决方法)解决问题的方法一:    1.方法文字描述:使用一个中间变量temp,实现两个变量值的互换    2.实现的具体代码: <?php  //声明两个变量$a,$b  $a = $_GET['a'];   $b = $_GET['b'];  //打印没有互换前,$a和$b var_dump("未替换前:a={$a} and b={$b}"); //使用中间变量$temp实现$a和$

交换两个变量以及不用第三个变量交换两个变量

这个可能网上一搜一大把一大把的,可是今天我看到了一个新的写法,所以就写这篇文章记录一下,不不知道百度有没有,没去搜索! 方法1:这是最简单,也是最常用的一个方法! int n1 = 10, n2 = 20; int tmp = n1; n1 = n2; n2 = tmp; Console.WriteLine("n1={0},n2={1}", n1, n2); Console.ReadKey(); 方法2:算术运算 //交换两个变量,不使用第三个变量 int n1 = 10, n2 =