在学java 中发现一个问题就是:如果我想交换两个数或者两个对象那么我该如何实现了?
在C 语言中需要交换两个数时,在函数中代码是这样实现的:
Void swap(int *a, int *b){
Int temp = *a;
*a = *b;
*b = temp;
}
而当我要在java 中做同样的交换了?显然在java 中并没有地址一说,更不用谈& 这个符号了。因此,个人认为在同一个对象中如果调用swap 方法是无法实现两者之间的调换。
例如:
Public class Person {
Public static void main(String[] args){
Int a = 2, b = 3;
System.out.println(“Before : a = ” + a + “, b = ” + b);
Swap(a,b);
System.out.println(“After : a = ” + a + “, b = ” + b”);
}
Static void swap(int a, int b){
Int temp = a;
a = b;
b = temp;
System.out.println(“End of method : a = ” + a + “, b = ” + b”);
}
}
明显的,这里的a 和 b 在经过调换函数后,并没有改变。那么我们就可以这样理解:当方法参数为非引用类型时即基本类型时,调用方法时,传递给方法的是一个值得拷贝,即“值传递”。
方法中变量a , b 的生命周期仅为当调用方法时到方法完成时。
现在验证另一种情况:就是当传递的是对象:
public class TestSwap {
public static void main(String[] args){
Person p1 = new Person("zou");
Person p2 = new Person("zheng");
System.out.println("调换前 :p1 = " + p1.print() + ", p2 = " + p2.print());
swap(p1,p2);
System.out.println("调换后 :p1 = " + p1.print() + ", p2 = " + p2.print());
}
static void swap(Person p1, Person p2){
Person temp = p1;
p1 = p2;
p2 = temp;
System.out.println("函数调换后 :p1 = " + p1.print() + ", p2 = " + p2.print());
}
}
class Person {
private String name;
Person(String name){this.name = name;}
String print(){return name;}
}
验证得知,调换后两对象并没发生改变。由此可以得出结论:当传递的是对象时,在方法中的引用是原始值的一份拷贝,在对方法中的对象变量进行调换时,原始的引用并没有发生改变,当方法结束时,方法中的变量即被全部销毁。由此可知,这里也是“值传递”。
当想改变某个对象里面属性的值时,在方法中是可以实现的。
public class TestSwap2 {
public static void main(String[] args){
Person p1 = new Person("zou");
Modify(p1);
System.out.println(p1.name);
}
static void modify(Person p){
p.name = "zheng";
System.out.println("End of method: " + p.name);
}
}
class Person {
public String name;
Person(String name){this.name = name;}
void print(){System.out.println(name);}
}
结果验证了上述的结论,当传递的是对象时,实际传递的是对象引用的一份拷贝,并不是将整个对象传递给方法,所以,方法中的引用值也指向同一个对象,当对对象进行操作时是有效的。