黑马程序员技术交流社区

标题: 关于调用方法的问题。(交换两个变量) [打印本页]

作者: 小柒    时间: 2015-8-10 23:00
标题: 关于调用方法的问题。(交换两个变量)
  1. class Change
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                
  6.                 int x=50,y=6;
  7.                 swap(x,y);
  8.                 System.out.println(x+"."+y);

  9.         }
  10.         public static void swap(int a,int b)
  11.         {
  12.                 int temp=0;
  13.                 if(a>b){
  14.                         temp=a;
  15.                         a=b;
  16.                         b=temp;
  17.                 }
  18.                 System.out.println(a+"."+b);
  19.         }
  20. }
  21. //为什么调用swap的时候ab的值没有交换?
复制代码

作者: 耀阳圣尊    时间: 2015-8-11 11:33
你的值确实交换了。但是X和Y是局部变量,你交换完了之后再打印XY就是局部变量里的值。
  1.                     int x = 50;
  2.                     int y = 6;
  3.             System.out.println("交换前"+"x="+ x +"y="+y);
  4.             swap(x,y);
  5.             

  6.     }
  7.     public static void swap(int a,int b)
  8.     {
  9.             int temp=0;
  10.             if(a>b){
  11.                     temp=a;
  12.                     a=b;
  13.                     b=temp;
  14.             }
  15.             
  16.            System.out.println("交换后"+"x="+ a +"y="+b);
  17.     }
复制代码




如果您觉得我的回答还满意的话,请回复一下我
我的QQ:2355928351
如果您还有其他的入学前问题可以加我的QQ

作者: 小柒    时间: 2015-8-11 15:55
耀阳圣尊 发表于 2015-8-11 11:33
你的值确实交换了。但是X和Y是局部变量,你交换完了之后再打印XY就是局部变量里的值。

谢谢啊,那要怎么修改呢?
作者: byr216    时间: 2015-8-11 17:16
小柒 发表于 2015-8-11 15:55
谢谢啊,那要怎么修改呢?

可以把两个值放在数组里
  1. package com.knowyou.test;

  2. public class ArrTest {

  3.         /**
  4.          * @param args
  5.          */
  6.         public static void main(String[] args) {
  7.                 int x = 50, y = 6;
  8.                 int[] arr = new int[2];
  9.                 arr[0] = x;
  10.                 arr[1] = y;
  11.                 swap(arr);
  12.                 x = arr[0];
  13.                 y = arr[1];
  14.                 System.out.println(x + "." + y);

  15.         }

  16.         public static void swap(int[] arr) {
  17.                 int temp = 0;
  18.                 if (arr[0] > arr[1]) {
  19.                         temp = arr[0];
  20.                         arr[0] = arr[1];
  21.                         arr[1] = temp;
  22.                 }
  23.                 System.out.println(arr[0] + "." + arr[1]);
  24.         }

  25. }
复制代码

作者: 亦如梦幻泡影    时间: 2015-8-11 17:32
因为 你的方法在调用完就从栈内存中消失了,主方法中的局部变量没什么变化,你要放在数组中进行交换,还有就是你仅仅是要交换两个变量的值为什么还要比较两个变量呢
作者: 小柒    时间: 2015-8-11 17:52
亦如梦幻泡影 发表于 2015-8-11 17:32
因为 你的方法在调用完就从栈内存中消失了,主方法中的局部变量没什么变化,你要放在数组中进行交换,还有 ...

哦,交换的时候又想着比较弄混了,基本类型和引用类型理解的很不清楚,能讲讲么?
作者: 亦如梦幻泡影    时间: 2015-8-11 18:40
这个结合内存图好理解,建议你去找找视频看  我只能说在参数传递过程中  基本类型:形式参数的改变对实际参数没有影响。引用类型:形式参数的改变直接影响实际参数。基本数据类型变量值在栈内存中,引用数据类型变量值在常量池中,在栈内存中的只是一个引用地址值,在调用方法时,方法加载到栈内存中后,传递的基本上数据类型的变量传过去的参数是具体的值,在方法执行完,方法从栈内存中消失,主方法中的基本数据类型数据不变,而传的参数为引用数据类型时传递过去的是引用变量地址值,在方法调用时 ,交换的是引用变量在常量池或堆内存中的值,当方法调用完从栈内存中消失后,主方法的地址值没有改变但是所指向的数据却是改变过的,所以用数组可以实现两个元素的交换而直接调用交换方法交换两个int类型数据是无法在主方法中是不变的,也就是上面所说的基本数据类型形参改变不影响实际参数,而引用数据类型形参改变实际参数也改变。
作者: iamzk    时间: 2015-8-11 18:48
public static void swap(int a,int b)函数中的形参a,b相当于定义在本函数中的局部变量,局部变量在该函数调用结束后其内存空间就会被释放。由于java中只有值传递,所以主函数中的调用swap(x,y);实际上是把实参x,y赋值给形参a,b,在swap函数内部实际上是操作的形参a,b,而不会改变实参的值。
而利用数组,由于数组是引用类型,所以在进行参数传递时实际传递的是数组元素的引用(即数组元素的地址),则在swap函数内部操作的是引用,是直接在地址上进行间接操作。




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