java 谁帮我看下这程序

来源:百度知道 编辑:UC知道 时间:2024/05/21 21:07:02
public class Function
{
public static void main(String[] agrs)
{
Integer add1 = new Integer(5);
Integer add2 = new Integer(6);
Commute.commute(add1,add2);
System.out.println("函数外的:add:");
System.out.println("add1=" + add1);
System.out.println("add2=" + add2);
}
}

class Commute
{
public static void commute(Integer add1, Integer add2)
{
Integer c = null;
c = add1;
add1 = add2;
add2 = c;
System.out.println("函数中的add:");
System.out.println("add1:" + add1 + "\n" + "add2:" + add2 );
}
}
/*为什么add1 和add2 没有实现值的交换了 我的意思是在函数外的 add1 和add2 应该也和
commute 函数里面的值一样啊交换了值 编程思想是C 的通过指针引用现实值的交换!
你能帮我改下么?*/

虽然Java里面的类对象类似于C里面的指针,虽然我知道你是也是这么理解的,但是你上面代码最大的问题是没有理解清楚C里面函数调用时候传递指针的原理。
好比下面的C代码:
void func(int* a, int* b) {
int* c = a;
a = b;
b = c;
}

void main() {
int* a = new int(3);
int* b = new int(4);
func(a,b);
}
你觉得通过上面这段函数,*a 等于多少? *b等于多少?
*a = 3 , *b = 4 吗?如果这样理解那就错了~~

首先你要理解函数的调用时候如果不是引用调用(C/C++特性,Java里面当然没有了)的话,那么出传递的并不是参数本身,而是参数的一个拷贝(这个可以多看一些实现原理的书)。
好比说上面的这段C++代码,虽然在main函数里面定义了a和b两个指针,但是传入的func里面的是这两个指针的拷贝(注意:虽然一个指针的拷贝和这个指针所指向的地址是相同的,但确实另外一个指针了)。如果把上面的main函数做的事情写在同一个函数里面的话,如下:
void main() {
int* a = new int(3);
int* b = new int(4);
//相当于调用func的时候参数的复制
int* a_copy = a;
int* b_copy = b;
// func的内容了
int* c = a_copy;
a_copy = b_copy;
b_copy = c;
}
这样是不是会清楚很多啊?执行完毕之后,a和b以及a所指向的内容和b所指向的内容并不会发生本质的变化。如果还不是很清楚,那我画个简单的图来说说吧:
指针************值
a-------------->|3|
copy_a ----------|

b--------------