Java 交换两个变量的数值实现方法_java

一、参数传递方法

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

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

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

二、Java参数传递方法

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

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

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

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

pubpc class MyClass{
  private Object num;

  pubpc MyClass(Object num){
    this.num=num;
  }

  pubpc Object getNum() {
    return num;
  }

  pubpc void setNum(Object num) {
    this.num = num;
  }
}
pubpc class Main {

  pubpc static void change(MyClass myClass){
    myClass.setNum(100);
  }

  pubpc 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。代码如下:

pubpc static void swap(MyClass a,MyClass b){
    MyClass tmp=a;
    a=b;
    b=tmp;
  }

  pubpc 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方法事,具体的执行过程是:

myClass被初始化成实参a的copy,这是对对象的引用。

setNum方法应用于这个对象的引用。myClass和a同时引用的那个MyClass对象的num变为了100。

方法结束后,参数变量myClass不再使用。而a继续引用那个num变为100的MyClass对象。如下图所示。

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

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

方法不能修改一个基本数据类型的参数;

方法可以改变对象参数的状态;

方法不能让对象参数引用一个新的对象(原因参考调用change方法时的具体执行过程)。

三、交换变量的数值

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

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

执行结果如下:

交换有效。

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

以上这篇Java 交换两个变量的数值实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java数值交换、java交换两个变量的值、java实现两个数交换、指针 交换数值、两数值交换位置,以便于您获取更多的相关知识。

时间: 2024-07-30 17:25:22

Java 交换两个变量的数值实现方法_java的相关文章

PHP不用第三个变量交换两个变量的值的方法总结

"PHP不用第三个变量交换两个变量的值"这个题看到过好多次了,看来面试确实喜欢考这道题.今天,对于这个题目,我自己总结了几种方法,可能不全,大家来互相补充. 方法一:使用字符串截取 <?php $a = "fsdfds"; $b = "xiaorui"; $a = $a.$b; $b = substr($a,0,strlen($a)-strlen($b)); $a = substr($a,strlen($b)); echo $a."

Java判断两个日期相差天数的方法_java

本文实例讲述了Java判断两个日期相差天数的方法.分享给大家供大家参考.具体如下: import java.util.Calendar; public class DateDifferent{ public static void main(String[] args){ Calendar calendar1 = Calendar.getInstance(); Calendar calendar2 = Calendar.getInstance(); calendar1.set(2007, 01,

java 保留两位小数的几种方法_java

1.代码: import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.NumberFormat; public class format { double f = 111231.5585; public void m1() { BigDecimal bg = new BigDecimal(f); double f1 = bg.setScale(2, BigDecimal.ROUND_HALF_UP)

[叩响C#之门]第2章 变量 2.8 深化练习:交换两个变量的值

2.8 深化练习:交换两个变量的值 好了,现在对你所学的知识作一下检验,请思考下面的问题. 已知a=2,b=5,交换a,b的值. 分析:请看下面的程序能否达到目的.

java计算两个时间相差天数的方法汇总_java

问题描述: 输入:两个日期 输出:两个日期相差的天数 具体代码实现 方法1: 通过Calendar类的日期比较.注意:这里需要考虑一下: 日期是跨年份的,如一个是2012年,一个是2015年的 年份是分闰年和平年的,各自的天数不同 /** * date2比date1多的天数 * @param date1 * @param date2 * @return */ public static int differentDays(Date date1,Date date2) { Calendar cal

浅谈java+内存分配及变量存储位置的区别_java

Java内存分配与管理是Java的核心技术之一,之前我们曾介绍过Java的内存管理与内存泄露以及Java垃圾回收方面的知识,今天我们再次深入Java核心,详细介绍一下Java在内存分配方面的知识.一般Java在内存分配时会涉及到以下区域: ◆寄存器:我们在程序中无法控制 ◆栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中(new 出来的对象) ◆堆:存放用new产生的数据 ◆静态域:存放在对象中用static定义的静态成员 ◆常量池:存放常量 ◆非RAM存储:硬盘等永久

java 在图片上写字,两个图片合并的实现方法_java

实例如下: package writeimg; import javax.imageio.ImageIO; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.net.URL; public class pic

举例讲解Java中数组和字符串类型的使用方法_java

Java数组 数组是具有相同数据类型的一组数据的集合,Java支持多为数组,一维数组的每个基本单元都是基本数据类型的数据,二维数组就是每个基本单元是一维数组的一维数组,以此类推,n维数组的每个基本单元都是n-1为数组的n-1维数组.下面以一维数组为例说明Java数组的用法. 1.数组声明 数组声明有如下两种形式(方括号的位置不同): int arr[]; int[] arr2; 2.数组初始化 数组初始化也有两种形式,如下(使用new或不使用new): int arr[] = new int[]

java通过控制鼠标实现屏幕广播的方法_java

本文实例讲述了java通过控制鼠标实现屏幕广播的方法.分享给大家供大家参考.具体分析如下: 在前面一篇<java实现屏幕共享功能实例分析>中提到截取屏幕时是没鼠标,为了看到教师端界面上的鼠标,可以在截取屏幕的时候,把鼠标绘制到每一张截图上去,但是由于截图的时候是一张张截取的,所以看到的鼠标难免会有点卡,之前写了java鼠标操控小程序,可以通过这种方式来看到鼠标的演示. 实现的方式也挺简单的,前面两篇文章分别实现了鼠标控制和不带鼠标的屏幕分享功能,把这两个结合一下就ok了,下面简单分析下. 服务