黑马程序员技术交流社区

标题: 关于交换值的问题 [打印本页]

作者: 九零零    时间: 2014-10-2 22:29
标题: 关于交换值的问题
本帖最后由 九零零 于 2014-10-3 21:51 编辑
  1. /**
  2.         给数组中元素进行位置的置换。
  3.         @param arr  接收一个int类型的数组。
  4.         @param a 要置换的位置
  5.         @param b 要置换的位置
  6.         */
  7.         private  static void swap(int[] arr,int a,int b)
  8.         {
  9.                 int temp = arr[a];
  10.                 arr[a] = arr[b];
  11.                 arr[b] = temp;
  12.         }
复制代码
为什么上面这段代码可以实现数组中元素的值交换,而下面的代码执行过之后输出的值没有变呢?
  1. public static void swap(int a,int b)
  2.         {
  3.                 int c;
  4.                 c = a;
  5.                 a = b;
  6.                 b = c;
  7.         }
  8. public static void print(int a )
  9.         {
  10.                 System.out.println(a);
  11.         }
  12. public static void main(String args[])
  13.         {
  14.                 int m = 3;
  15.                 int n = 2;
  16.                 swap(m,n);
  17.                 print(m);
  18.                 print(n);
  19.                
  20.         }
复制代码



作者: 杨佳名    时间: 2014-10-2 22:45
JAVA中数据的类型按数据在内存的储存方法可以分成二大类,
一种是基本数据类型,保存在栈内存,变量直接保存的就是值,基本数据类型在传递的时候,传递的是值的副本
而int就是基本数据类型中的一种.如在 swap(m,n);方法的时候,会传递mn的值的副本进来,并不是mn的本身,所以在
swap()方法中无论你怎么操作,都不会影响main方法的mn的值,所以在main打印的结果是原来的结果,但是在swap方法中的mn的值则是已经更换过了的
将输入语句放入swap()方法中,即可得到交换。
总之,Java中方法参数传递是值传递

作者: 九零零    时间: 2014-10-2 22:47
杨佳名 发表于 2014-10-2 22:45
JAVA中数据的类型按数据在内存的储存方法可以分成二大类,
一种是基本数据类型,保存在栈内存,变量直接保存的 ...

谢谢,那为什么第一段代码可以呢?第一段代码是老师写数组排序时用来交换值的
作者: 杨佳名    时间: 2014-10-2 23:09
如图。。。。。。。

无标题.png (96.55 KB, 下载次数: 8)

无标题.png

作者: 罗林军    时间: 2014-10-2 23:55
九零零 发表于 2014-10-2 22:47
谢谢,那为什么第一段代码可以呢?第一段代码是老师写数组排序时用来交换值的 ...

是因为引用数据类型传递的是地址,数组传递的也是地址值,基本数据类型才传递的是值的副本
基本数据类型有:整数类型(byte, short, int, long)、浮点类型(float, double)、布尔型(boolean)
引用数据类型有:类(class)、接口(interface)、数组([])
作者: 九零零    时间: 2014-10-3 12:46
罗林军 发表于 2014-10-2 23:55
是因为引用数据类型传递的是地址,数组传递的也是地址值,基本数据类型才传递的是值的副本
基本数据类型 ...

这样啊 谢谢
作者: 九零零    时间: 2014-10-3 12:48
杨佳名 发表于 2014-10-2 23:09
如图。。。。。。。

辛苦了 谢谢
作者: ⋛⋌⋚JEEP    时间: 2014-10-3 13:55
方法调用时,是值传递还是引用传递?
主要看形式参数类型(或者看实际参数),如果是8大基本数据类型(8大基本数据类型的具体值),就是值传递;如果是类类型或者数组类型(对象或者数组),那就是引用传递。
具体分析---->
值传递:方法调用时,实际参数把自己的值传递给相应的形式参数,而形式参数仅仅是使用了实际参数的值初始化自己的存储单元内容。也就是说,形式参数中的值仅仅是实际参数的值的副本,在方法中做任何改变将不影响实际参数的值,跟实际参数没有任何关系。
引用传递:方法调用时,实际参数和形式参数指向同一个地址值,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,这个结果在方法结束后被保留了下来,所以方法执行中形式参数的改变将会影响实际参数。
注意:形式参数和实际参数的区别!
所以,楼主第一段代码是引用传递问题,第二段是值传递问题。具体分析如上!(附图,仅作参考!)

Unnamed.jpg (45.46 KB, 下载次数: 15)

Unnamed.jpg

作者: 张业婷    时间: 2014-10-3 14:14
杨佳名 发表于 2014-10-2 22:45
JAVA中数据的类型按数据在内存的储存方法可以分成二大类,
一种是基本数据类型,保存在栈内存,变量直接保存的 ...

还是有点不解!为什么穿过去是一个副本啊?
作者: 戏言丶    时间: 2014-10-3 14:41
楼上很多大神
作者: 郑飞    时间: 2014-10-3 16:59
就是说int做参数 传到方法里的只是一个常量值 不能当作互换值的过渡变量
作者: x564573138    时间: 2014-10-3 17:26
沙发。。。。。。。
作者: 笑脸迷人    时间: 2014-10-3 20:10
学到了~
作者: 九零零    时间: 2014-10-3 21:47
⋛⋌⋚JEEP 发表于 2014-10-3 13:55
方法调用时,是值传递还是引用传递?
主要看形式参数类型(或者看实际参数),如果是8大基本数据类型(8大 ...

谢谢 很透彻 明白了 赞一个
作者: 838598737    时间: 2014-10-6 20:09
数据类型是分为基本类型和引用数据类型,int属于基本类型,基本类型赋值只是通过直接创建一个变量直接在栈中存储。
当调用swap(m,n);的时候,传入swap方法中的m,n已经是重新创建的了而不是原来的int m = 3;int n = 2;
所以在swap中改m,n的值是不会改变main函数中的m,n。
如果m,n是string类型的话,因为是引用传递就会改变其值




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2