swap(User u1,User u2) 是无法实现的,因为 Java 是传值的,所以这个方法并不会改变 u1 和 u2 两个变量的值(即它们的引用)。
楼主的想法在 java 中是做不到的void swap(User user1, User user2) { ...... }User u1 = ...... User u2 = ......swap(u1, u2);后来方法被调用时,传进来的是原有引用的一个拷贝而已比如说,变量u1和u2分别是两张名片,上面记录了两个 User 对象的地址调用swap时,并没有直接把 u1 和 u2 传到方法中去,而是另外找了两张空白的卡片,把u1和u2上的两个 User 对象的地址抄写到这两张空白卡片上,然后送到 swap 方法内部。当然,在swap方法内部,这两张卡片的内容还是发生了交换,但是 u1 和 u2 还是老样子
org.apache.commons.beanutils.BeanUtilscopyProperties(Object dest, Object orig) Copy property values from the origin bean to the destination bean for all cases where the property names are the same.
String temp = null;
temp = u1.name ;
u1.name = u2.name;
u2.name = temp;
}
C#提供了ref 和 out 关键字,可以实现这个功能。
如果用C的思路来理解u1和u2是两个指针
在函数里,你可以改变u1和u2所指向的内容,
但这两个指针本身的值却不能改变,
要想改变,你就得把指针本身的地址传过去
java好像没有提供这样的语法。
void swap(User u1,User u2) {
User temp = null;
temp = u1;
u1= u2;
u2= temp;
}
这样不就可以了么?其实就是把引用互换一下。没有必要硬要去替换heap中的对象了吧?
User temp = null;
temp = u1;
u1= u2;
u2= temp;
}
这样交换,两个对象的name还是没有交换的 分析下内存试下
如果通过对象的引用去交换name字段,倒是交换了
......
}User u1 = ......
User u2 = ......swap(u1, u2);后来方法被调用时,传进来的是原有引用的一个拷贝而已比如说,变量u1和u2分别是两张名片,上面记录了两个 User 对象的地址调用swap时,并没有直接把 u1 和 u2 传到方法中去,而是另外找了两张空白的卡片,把u1和u2上的两个 User 对象的地址抄写到这两张空白卡片上,然后送到 swap 方法内部。当然,在swap方法内部,这两张卡片的内容还是发生了交换,但是 u1 和 u2 还是老样子
Copy property values from the origin bean to the destination bean for all cases where the property names are the same.
在java的方法里面,如果交换引用,方法结束后这种交换就失去了作用。
但是,如果交换的是对象里的属性值,方法结束后引用虽然失去了作用,但是对象内的属性值已经改变
user1.name=user2.name;
user2.name=a;
User u=null;
u=u1;
u1=u2;
u2=u;
}改变了引用所指向的对象