黑马程序员技术交流社区

标题: 如何定义一个函数实现两个整数的互换 [打印本页]

作者: 任黎明    时间: 2014-6-19 10:14
标题: 如何定义一个函数实现两个整数的互换
class Swap
{
public static void main(String[] args)
{
  int num1=1;
  int num2=1024;
  System.out.println("调用前"+"num1="+num1+",num2="+num2);
  swap(num1,num2);
  System.out.println("调用后"+"num1="+num1+",num2="+num2);
}
//定义一个方法互换两个变量的值
public static void swap(int a,int b){
  int temp=a;
  a=b;
  b=temp;
  System.out.println("内部运行结果:a(num1)="+a+",b(num2)="+b);
}
}
调用前num1=1,num2=1024
内部运行结果:a(num1)=1024,b(num2)=1
调用后num1=1,num2=1024

-------------问什么实现不了函数的功能,如何才能实现函数的功能!

作者: 会飞De石头    时间: 2014-6-19 10:24
本帖最后由 会飞De石头 于 2014-6-19 10:26 编辑

 Java 方法的参数是简单类型的时候,是按值传递的 (pass by value),所以Java里面不能实现和C中一样的swap方法来交换两个数的值。
参数类型是简单类型的时候,是按值传递的。以参数形式传递简单类型的变量时,实际上是将参数的值作了一个拷贝传进方法函数的,那么在方法函数里再怎么改变其值,其结果都是只改变了拷贝的值,而不是源值。
作者: 冯云飞    时间: 2014-6-19 11:41
楼上说的或许对吧  在上班 没细看  
作者: 杨桦    时间: 2014-6-19 14:16
有好多种方式吧
作者: Stevenj    时间: 2014-6-19 15:01
冯云飞 发表于 2014-6-19 11:41
楼上说的或许对吧  在上班 没细看

来学习,学习,加油楼主
作者: 初升的晨曦    时间: 2014-6-19 15:14
你可以把方法内部改一下,把交换完后的值存数组里.然后返回这个数组.外面在用之前的变量去接收一下.我目前想到的是这样的.2楼的说的很对, Java不能像C#那样引用传递.只能值传递.
作者: wyg129911    时间: 2014-6-19 18:04
这个问题是值传递的问题
你在主函数调用swap(num1,num2);
实际上你是把num1和num2的值赋值给了函数swap(int a,int b)的a和b
所以你看你最后的结果
调用前num1=1,num2=1024
内部运行结果:a(num1)=1024,b(num2)=1
调用后num1=1,num2=1024
证明a和b的值是对换了,但是变量num1和num2的值依然没变
实际上就是内存中有4个变量(num1,num2,a,b)你怎么改变a,b的值都不会影响到num1,num2
如果是传地址就不会有问题了
代码如下:

class Swap {
         public static void main(String[] args)
         {
                 int[] num=new int[] {1,1024};
           System.out.println("调用前"+"num1="+num[0]+",num2="+num[1]);
           swap(num);
           System.out.println("调用后"+"num1="+num[0]+",num2="+num[1]);
         }
         //定义一个方法互换两个变量的值
        public static void swap(int[]arr){
           int temp=arr[0];
           arr[0]=arr[1];
           arr[1]=temp;
           System.out.println("内部运行结果:num1="+arr[0]+",num2="+arr[1]);
         }
        }


补充一点:
2个数交换其实可以用位运算,而且不用第三个变量

class Swap {
         public static void main(String[] args)
         {
                 int[] num=new int[] {1,1024};
           System.out.println("调用前"+"num1="+num[0]+",num2="+num[1]);
           swap(num);
           System.out.println("调用后"+"num1="+num[0]+",num2="+num[1]);
         }
         //定义一个方法互换两个变量的值
        public static void swap(int[]arr){
           arr[0]=arr[0]^arr[1];   
           arr[1]=arr[0]^arr[1];   
           arr[0]=arr[0]^arr[1];   
           System.out.println("内部运行结果:num1="+arr[0]+",num2="+arr[1]);
         }
        }
结果一样
作者: gyw520gyw    时间: 2014-6-19 22:50
你是实现两个数的互换,
  1. int temp=a;
  2.   a=b;
  3.   b=temp;
  4.   System.out.println("内部运行结果:a(num1)="+a+",b(num2)="+b);
复制代码


结果是:内部运行结果:a(num1)=1024,b(num2)=1

这个已经互换了啊,

你的这句
  1. System.out.println("调用后"+"num1="+num1+",num2="+num2);
复制代码
是多余的,
实现互换只需要看 void swap(int a,int b)函数就可以了

参数作为局部变量,作用域只能在本函数中
作者: ╭月牙湾湾╮    时间: 2014-6-20 21:40
逛楼拿币     
作者: 千里一醉    时间: 2014-6-21 22:22
其实你已经实现了两个数的互换。
你是值传递,赋值为就近原则。并没有将num1和num2所指向的地址改变。
看下值传递和引用传递的区别。
作者: FnSean    时间: 2014-6-22 23:54
还没学到函数那一步,看着好深奥,不过也看懂了一部分
作者: 独孤求傲    时间: 2015-11-28 23:03
目前还看不懂,




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