黑马程序员技术交流社区
标题:
如何定义一个函数实现两个整数的互换
[打印本页]
作者:
任黎明
时间:
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
你是实现两个数的互换,
int temp=a;
a=b;
b=temp;
System.out.println("内部运行结果:a(num1)="+a+",b(num2)="+b);
复制代码
结果是:内部运行结果:a(num1)=1024,b(num2)=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