A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  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的值没有交换?
复制代码

7 个回复

正序浏览
iamzk 中级黑马 2015-8-11 18:48:06
8#
public static void swap(int a,int b)函数中的形参a,b相当于定义在本函数中的局部变量,局部变量在该函数调用结束后其内存空间就会被释放。由于java中只有值传递,所以主函数中的调用swap(x,y);实际上是把实参x,y赋值给形参a,b,在swap函数内部实际上是操作的形参a,b,而不会改变实参的值。
而利用数组,由于数组是引用类型,所以在进行参数传递时实际传递的是数组元素的引用(即数组元素的地址),则在swap函数内部操作的是引用,是直接在地址上进行间接操作。
回复 使用道具 举报
这个结合内存图好理解,建议你去找找视频看  我只能说在参数传递过程中  基本类型:形式参数的改变对实际参数没有影响。引用类型:形式参数的改变直接影响实际参数。基本数据类型变量值在栈内存中,引用数据类型变量值在常量池中,在栈内存中的只是一个引用地址值,在调用方法时,方法加载到栈内存中后,传递的基本上数据类型的变量传过去的参数是具体的值,在方法执行完,方法从栈内存中消失,主方法中的基本数据类型数据不变,而传的参数为引用数据类型时传递过去的是引用变量地址值,在方法调用时 ,交换的是引用变量在常量池或堆内存中的值,当方法调用完从栈内存中消失后,主方法的地址值没有改变但是所指向的数据却是改变过的,所以用数组可以实现两个元素的交换而直接调用交换方法交换两个int类型数据是无法在主方法中是不变的,也就是上面所说的基本数据类型形参改变不影响实际参数,而引用数据类型形参改变实际参数也改变。
回复 使用道具 举报
亦如梦幻泡影 发表于 2015-8-11 17:32
因为 你的方法在调用完就从栈内存中消失了,主方法中的局部变量没什么变化,你要放在数组中进行交换,还有 ...

哦,交换的时候又想着比较弄混了,基本类型和引用类型理解的很不清楚,能讲讲么?
回复 使用道具 举报
因为 你的方法在调用完就从栈内存中消失了,主方法中的局部变量没什么变化,你要放在数组中进行交换,还有就是你仅仅是要交换两个变量的值为什么还要比较两个变量呢
回复 使用道具 举报
小柒 发表于 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 11:33
你的值确实交换了。但是X和Y是局部变量,你交换完了之后再打印XY就是局部变量里的值。

谢谢啊,那要怎么修改呢?
回复 使用道具 举报
你的值确实交换了。但是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
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马