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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 任黎明 中级黑马   /  2014-6-19 10:14  /  6453 人查看  /  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 个回复

正序浏览
目前还看不懂,
回复 使用道具 举报
还没学到函数那一步,看着好深奥,不过也看懂了一部分
回复 使用道具 举报
其实你已经实现了两个数的互换。
你是值传递,赋值为就近原则。并没有将num1和num2所指向的地址改变。
看下值传递和引用传递的区别。
回复 使用道具 举报
逛楼拿币     
回复 使用道具 举报
你是实现两个数的互换,
  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)函数就可以了

参数作为局部变量,作用域只能在本函数中
回复 使用道具 举报
这个问题是值传递的问题
你在主函数调用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]);
         }
        }
结果一样
回复 使用道具 举报
你可以把方法内部改一下,把交换完后的值存数组里.然后返回这个数组.外面在用之前的变量去接收一下.我目前想到的是这样的.2楼的说的很对, Java不能像C#那样引用传递.只能值传递.
回复 使用道具 举报
冯云飞 发表于 2014-6-19 11:41
楼上说的或许对吧  在上班 没细看

来学习,学习,加油楼主
回复 使用道具 举报
有好多种方式吧
回复 使用道具 举报
楼上说的或许对吧  在上班 没细看  
回复 使用道具 举报
本帖最后由 会飞De石头 于 2014-6-19 10:26 编辑

 Java 方法的参数是简单类型的时候,是按值传递的 (pass by value),所以Java里面不能实现和C中一样的swap方法来交换两个数的值。
参数类型是简单类型的时候,是按值传递的。以参数形式传递简单类型的变量时,实际上是将参数的值作了一个拷贝传进方法函数的,那么在方法函数里再怎么改变其值,其结果都是只改变了拷贝的值,而不是源值。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马