在学习语言时,我们总是找着另一种相似的语言来对比学习这一门语言,例如:C++与Java。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Java参数传递到底是进行值传递,还是引用传递呢?
如果用如下定义两者;
值调用(call by value) : 在参数传递过程中,形参和实参占用了两个完全不同的内存空间。形参所存储的内容是实参存储内容的一份拷贝。
引用调用(call by reference) : 在参数传递的过程中,形参和实参完全是同一块内存空间,两者不分彼此
那么参数传递时就是值传递。
例:
package com.wang;
public class Person{
public String name;
public Person(String name){ this.name=name;
}
public static void swap(Person p1,Person p2){
Person temp=p1;
p1=p2;
p2=temp;
System.out.println(p1.name+" "+p2.name);
}
public static void main(String[] args) {
Person person1= new Person("赵钱孙");
Person person2=new Person("周吴郑");
swap(person1,person2);
System.out.println(person1.name+" "+person2.name);
}
}
输出的结果为:周吴郑 赵钱孙
赵钱孙 周吴郑
person1和person2并没有改变;
若采用如下方式:
package com.wang;
public class Person{
public String name;
public Person(String name){ this.name=name;
}
public static void swap(Person p1,Person p2){
String temp=p1.name;
p1.name=p2.name;
p2.name=temp;
System.out.println(p1.name+" "+p2.name);
}
public static void main(String[] args) {
Person person1= new Person("赵钱孙");
Person person2=new Person("周吴郑");
swap(person1,person2);
System.out.println(person1.name+" "+person2.name);
}
}
输出的结果则为:周吴郑 赵钱孙
周吴郑 赵钱孙
证明了对象传递只是实参的地址的拷贝;操作传入对象内部的属性才会引起外部实参状态的改变
若不想改变外部的实参状态,那就用克隆 Person p3=(Person) person1.clone();
此方法会克隆下person1的属性,但若person属性中还有另一个对象;则依次进行深克隆;
|
|