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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 任黎明 中级黑马   /  2014-6-19 10:14  /  6499 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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

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

11 个回复

倒序浏览
本帖最后由 会飞De石头 于 2014-6-19 10:26 编辑

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

来学习,学习,加油楼主
回复 使用道具 举报
你可以把方法内部改一下,把交换完后的值存数组里.然后返回这个数组.外面在用之前的变量去接收一下.我目前想到的是这样的.2楼的说的很对, Java不能像C#那样引用传递.只能值传递.
回复 使用道具 举报
这个问题是值传递的问题
你在主函数调用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]);
         }
        }
结果一样
回复 使用道具 举报
你是实现两个数的互换,
  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)函数就可以了

参数作为局部变量,作用域只能在本函数中
回复 使用道具 举报
逛楼拿币     
回复 使用道具 举报
其实你已经实现了两个数的互换。
你是值传递,赋值为就近原则。并没有将num1和num2所指向的地址改变。
看下值传递和引用传递的区别。
回复 使用道具 举报
还没学到函数那一步,看着好深奥,不过也看懂了一部分
回复 使用道具 举报
目前还看不懂,
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马