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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 何仕映 中级黑马   /  2013-3-13 19:25  /  3142 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 猫腻 于 2013-3-14 22:28 编辑

在JAVA中,给函数传递一个引用型变量,使该函数处理该数据,实际上传递的是该变量在对内存中实体的内存地址值。使之到达操作该数据的目的。但是JAVA中没有指针又如何调用一个函数来操作非引用行变量呢?下面这个程序该如何写才能使连个整型数据的值交换呢?
  1. class ArrTest                        
  2. {
  3.         public static void main(String[] args)//主函数
  4.         {
  5.                 int[] arr = {1,2};        //定义两个数组
  6.                 int x = 11;
  7.                 int y = 22;

  8.                 print("arr未交换前的元素顺序",arr);  //打印未交换前数组中的元素
  9.                 print("x与y交换前的值是",x);
  10.                 print("y与x交换前的值是",y);

  11.                 swap_1(arr,0,1);                                        //调用交换方法一,并打印交换后的结果
  12.                 print("arr调用交换方法一后的元素顺序",arr);

  13.                 swap_2(x,y);                        //调用交换方法二,并打印交换后的结果
  14.                 print("x与y交换后的值是",x);
  15.                 print("y与x交换后的值是",y);
  16.         }


  17.         //将两个数进行交换方法一
  18.         public static void swap_1(int[] arr,int x,int y)
  19.         {
  20.                 int temp = arr[x];
  21.                 arr[x] = arr[y];
  22.                 arr[y] = temp;               
  23.         }
  24.         //将两个数进行交换方法二
  25.         public static void swap_2(int x,int y)
  26.         {
  27.                 int temp = x;
  28.                 x = y;
  29.                 y = temp;               
  30.         }

  31.         //将数组输出
  32.         public static void print(String s,int[] arr)
  33.         {
  34.                 System.out.print(s+"arr = {");
  35.                 for (int i=0; i<arr.length; ++i)
  36.                 {
  37.                         if (i != arr.length-1)
  38.                         {
  39.                                 System.out.print(arr[i]+" ");
  40.                         }
  41.                         if (i==arr.length-1)
  42.                         {
  43.                                 System.out.print(arr[i]+"}"+"\n");
  44.                         }
  45.                 }
  46.         }

  47.         //将单个整数输出
  48.         public static void print(String s,int x)
  49.         {
  50.                 System.out.println(s+x);

  51.         }

  52. }
  53. /*
  54. 执行结果
  55. ============================================
  56. <blockquote>arr未交换前的元素顺序arr = {1 2}
复制代码
============================================
*/

评分

参与人数 1技术分 +1 收起 理由
洪建超 + 1

查看全部评分

8 个回复

倒序浏览
不太明白你的意思!!!
回复 使用道具 举报
就是如和定义一个函数,调用该数能把原先x的值赋给y,把y的值赋给x啊
回复 使用道具 举报
本帖最后由 姓名长度不符 于 2013-3-13 19:43 编辑

新建个中间变量啊,   int temp = arr[x];
                                   arr[x] = arr[y];
                                   arr[y] = temp;    这里好像不对,应该是i
                                   int temp  =arr[x];
                                   arr[x] = arr[y];
                                   arr[y] = temp;
回复 使用道具 举报
你这是有两个问题,问题一:JAVA中没有指针又如何调用一个函数来操作非引用行变量呢?
Java提供了一种引用(Reference)类型用来替代指针,通过引用去访问申请到的内存空间,可以确保不会访问不属于自己的内存空间,同时,程序的执行系统也可以动态地做内存垃圾回收工作,将那些被取消引用的内存空间回收给系统使用。这种动态内存分配机制,通过牺牲一定的灵活性,保证了内存分配一定程度上的安全性。
问题二:下面这个程序该如何写才能使连个整型数据的值交换呢?
你的执行结果为
arr未交换前的元素顺序arr = {1 2}
x与y交换前的值是11
y与x交换前的值是22
arr调用交换方法一后的元素顺序arr = {2 1}
x与y交换后的值是11
y与x交换后的值是22
对于问题二你再追问

评分

参与人数 2技术分 +1 黑马币 +9 收起 理由
洪建超 + 1
樊玲 + 9 赞一个!

查看全部评分

回复 使用道具 举报
如果你学过c语言的话,这里面的道理其实就比较容易理解了,
java中众多的优点中,也继承了c语言的一些语法,其中就包括数组

数组,是在内存中分配的一段连续的空间,数组名就是数组的首地址,而使用arr[]的意思就是,指向某个地址块的内容,
因此,将地址中的内容改变了,自然输出的数组也就变了。

而对于原生数据类型,像你定义在方法里面的x和y,这里是关于方法执行的一点知识。
方法执行都是通过压栈和出栈来操作,当调用另一个方法时,你把原生数据x、y传给了另一个函数,
在另一个函数里会生成一份一样的数据拷备,而不像引用类型,传一个引用的地址值,
因此在另一个函数改变的值只在那个函数中有作用,一旦函数出栈,回到调用者时,
调用者函数中的值是不会有什么变化的。

评分

参与人数 1技术分 +1 收起 理由
猫腻 + 1

查看全部评分

回复 使用道具 举报
fighting 发表于 2013-3-13 23:11
如果你学过c语言的话,这里面的道理其实就比较容易理解了,
java中众多的优点中,也继承了c语言的一些语法 ...

就是说JAVA不能编写一个函数把两个整型数据的内容交换是吗?
回复 使用道具 举报
程序该如何写才能使连个整型数据的值交换呢?
回复 使用道具 举报
何仕映 发表于 2013-3-14 10:36
就是说JAVA不能编写一个函数把两个整型数据的内容交换是吗?

是这样的,除非使用指针
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马