一、参数传递方法

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

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

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

  1. JAVA交换两个变量的值-(不使用第三变量)

    以下方法的根本原理就是: 借助第三个变量 c = a; a = b; b = c; 运算符-不借助第三变量: a = a+b; b = a-b; a = a-b; 为运算符-不借助第三个变量: (此种 ...

  2. Java实现两个变量的互换(不借助第3个变量)

    创建一个类,在该类中定义两个变量并为其指定初始值,然后交换两个变量的值,要求不允许借助第三个变量,只能使用异或运行实现两个变量值的交换. import java.util.Scanner; publi ...

  3. 【剑指offer】不使用新变量,交换两个变量的值,C++实现

    # 题目 不使用新变量,交换两个变量的值. # 思路 方法一:使用加减法操作,交换两个变量的值. A = A+B B = A-B A = A-B 方法二:使用异或运算,交换两个变量的值 A = A^B ...

  4. 面试题-JavaScript交换两个变量的方法

    在平时的业务开发或者面试过程中,经常会遇到交换两个变量这种问题,于是,个人总结以下几种交换变量的方法: 1.方案一 使用一个临时变量来交换  2.方案二 使用ES6解构赋值语法来交换 3.方案三利用数 ...

  5. JavaScript中交换两个变量的值得三种做法(代码实现)

    javascript在编程时经常会涉及到如何交换两个变量的值,例如常见的冒泡排序,快速排序等:下面我讲根据自己近期所学总结几种常见的交换两个变量值的方法: 方法一:借助第三方变量交换两个变量的值 va ...

  6. python不使用第三方变量,交换两个变量的值

    #不使用第三个变量交换两个变量的值 a=1 b=2 a,b=b,a#python的直接交换 #另一种交换方法 a=a+b#a=3 b=2 b=a-b#a=3 b=1 a=a-b#a=2 b=1 pri ...

  7. C语言:指针实现交换两个变量的值

    用指针交换两个变量的值(10分) 题目内容: 用指针交换两个变量的值 主函数参考: int main( ) { int a,b; scanf("%d%d",&a,& ...

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

    相信大家在PHP面试或者学习中经常会遇到这个问题就是“不用第三个变量来交换两个变量的值”,今天正对这个问题来讨论一下: 第一种方法:首先会想到的 这种方法简单可行,顺利的交换了两个变量的值. 第二种方 ...

  9. python中如何调用函数交换两个变量的值

    python中如何调用函数交换两个变量的值 所有代码来在python3.7.1版本实现 以下实例通过用户输入两个变量,并相互交换:  方法一: def swap(a,b): # 创建临时变量,并交换 ...

随机推荐

  1. .net下载文件方法

    1.以文件流下载 byte[] fileStr=new byte[5]; MemoryStream btMs = new MemoryStream(fileStr); //以字符流的形式下载文件 by ...

  2. windows下安装wamp和wordpress

    安装wamp WAMP是一个windows上的php开发集成环境,一键安装php,apache和mysql,非常方便. 双击wampserver2.2exxxxxxxxxx.exe文件进行安装,安装过 ...

  3. ecmall 后台导航增加菜单

    以我增加的团购为例: languages\sc-gbk\admin 中的default.lang.php 文件中底部增加变量值 'groupbuy'=>'团购',    'groupbuyord ...

  4. Linux进程和进程边界

    1. 进程和线程 2. 手机操作系统的发展 3. 进程的地址空间边界 4. 进程边界的安全围栏: Crash的不可扩延性 5. 进程边界的安全围栏: 全局数据和服务的不可访问性 http://www. ...

  5. Git中从远程的分支获取最新的版本到本地

    Git中从远程的分支获取最新的版本到本地有这样2个命令: 1. git fetch:相当于是从远程获取最新版本到本地,不会自动merge    git fetch origin mastergit l ...

  6. python中的函数的参数和可变参数

    最近在搞python的过程中需要用到给函数传可变参数..所以去网上找前人的帖子学习了一下 为了尊重原作者,这里附上链接:http://www.cnblogs.com/tqsummer/archive/ ...

  7. 源码编译基于Android平台的XBMC笔记

    参考官方网站:https://github.com/xbmc/xbmc/blob/master/docs/README.android   1. 编译主机系统 Ubuntu (12.04) 64Bit ...

  8. 反射 DataTable拓展方法 转实体对象、实体集合、JSON

    Mapper类 using System; using System.Collections.Generic; using System.Data; using System.Globalizatio ...

  9. PS证件照换背景

    综述 博主原创内容. 在PS里,对于抠图,比较有技术含量的便是抠头发丝了,下面为大家带来一个比较详细的抠头发丝的教程. 素材准备 在这里我们用这张图片作为抠图素材,下面让我们一步步来演示抠图的过程,并 ...

  10. 写个自动下载安装Ant的shell脚本【二】

    #!/bin/bash ####################################################### file name: install_ant.sh# # fun ...