黑马程序员技术交流社区

标题: 引用数据类型和基本数据类型在传参数后,有什么区别 [打印本页]

作者: 北极£莜蓝    时间: 2014-6-3 22:21
标题: 引用数据类型和基本数据类型在传参数后,有什么区别
  1. class Test {
  2.                 public static void main(String[] args)
  3.                 {
  4.                         /*int a = 10;
  5.                         int b = 20;
  6.                         System.out.println("a:"+a+",b:"+b);
  7.                         change(a,b);
  8.                         System.out.println("a:"+a+",b:"+b);
  9.                         */
  10.                         int[] arr = {1,2,3,4,5};
  11.                         change(arr);
  12.                         System.out.println(arr[1]);
  13.                         System.out.println("================");
  14.                         for(int x =0;x < arr.length;x++)
  15.                    {
  16.                                 System.out.println("没反转前的数值"+arr[x]);
  17.                    }
  18.                         System.out.println("***********************");
  19.                         fanZhuan(arr);
  20.                         System.out.println("---------------------");
  21.                         for(int x =0;x < arr.length;x++)
  22.                    {
  23.                                 System.out.println("调用反转函数后的"+arr[x]);
  24.                    }
  25. }
  26.                          public static  void fanZhuan(int[] arr)
  27.                  {
  28.                         int[] brr =new int [arr.length];
  29.                         int temp = arr.length -1;
  30.                         for(int x = 0;x < arr.length;x++)
  31.                         {
  32.                                 brr[temp-x] =arr[x];
  33.                         }
  34.                           arr = brr;//数组数据反序列
  35.                           for(int x =0;x < arr.length;x++)
  36.                            {
  37.                                         System.out.println("反转函数中的调用输出"+arr[x]);
  38.                            }
  39.                 }
  40.                 public static void change(int a,int b)
  41.                 {
  42.                         System.out.println("a:"+a+",b:"+b);
  43.                         a = b;
  44.                         b = a + b;
  45.                         System.out.println("函数调用输出"+"a:"+a+",b:"+b);
  46.                 }

  47.                 public static void change(int[] arr)
  48.                 {
  49.                         for(int x=0; x<arr.length; x++)
  50.                         {
  51.                                 if(arr[x]%2==0)
  52.                                 {
  53.                                         arr[x]*=2;
  54.                                 }
  55.                         }
  56.          }
  57.        
  58.                
  59.         }
  60.        
复制代码


引用数据类型在函数内调用.png (98.88 KB, 下载次数: 11)

引用数据类型在函数内调用.png

作者: 北极£莜蓝    时间: 2014-6-3 22:23
这里change(arr);调用后都可以改变原数组的值,而fanZhuan(arr);调用后只在函数内部有效,出了该函数后.还是原来的数组值,求大神来个内存运行图,
作者: 王亚亚    时间: 2014-6-3 23:27
这里的fanZhuan(arr)中,你一直操作的都是brr数组,堆中是arr并没有变。最后只是把arr= brr;就相当于a=b;一样,当方法fanzhuan()出栈时候arr没有变化。依然是定义的arr。而change(arr)时候,一直操作的是堆中的数据,因此当change()出栈时候arr的地址没有改变,但是堆中的数据已经改变过了,所以打印出来的值和以前不一样。
作者: 北极£莜蓝    时间: 2014-6-4 22:44
王亚亚 发表于 2014-6-3 23:27
这里的fanZhuan(arr)中,你一直操作的都是brr数组,堆中是arr并没有变。最后只是把arr= brr;就相当于a=b ...

恩谢谢了.理解了.只有对引用数据类型内的数据操作时才会改变结果




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