Java中何为值传递,何为引用传递,我相信这应当是很多Java人平常都会忽略的一个比较纠结的问题,这里我举几个实例来对此予以说明。
先来看看下面两个简单的例图:
第一个图是引用传递的说明图,将对象1传递给对象2后,对象2的句柄(类似于C++的指针)也指向对象1的地址,这个时候如果我们修改了对象2的属性值,那么也会修改对象1相对应的属性值。
第二个图是值传递的说明图,将基础数据1(如一个字符串)传递给基础数据2(如另一个字符串)后,修改基础数据2的值并不会影响到基础数据1的值,因为两者指向的地址并不是一样的。
下面举几个值传递与引用传递的例子:
/**
* @description :值传递举例
* @date : 2014-4-2下午04:10:28
* @author :wanbaojian
*/
public class Test {
public static void main(String[] args){
String str1="wangbaojian";
String str2=null;
System.out.println("值传递....传值前:str1= "+str1+" "+" str2= "+str2);
str2=str1;
str2="yanhhuihui";
System.out.println("值传递....传值后:str1= "+str1+" "+" str2= "+str2);
}
}
打印结果:
/**
* @description :引用传值举例
* @date : 2014-4-2下午04:08:17
* @author :王宝健
*/
public class Person {
private String name;
private String sex;
private int age;
public Person(){
}
public Person(String name,String sex,int age){
this.name=name;
this.sex=sex;
this.age=age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public static void main(String[] args) {
Person p1=new Person("wangbaojian","nan",26);
Person p2=null;
System.out.println("传值前.....姓名:"+p1.getName()+"性别:"+p1.getSex()+"年龄:"+p1.getAge());
p2=p1;
p2.setName("yanghuihui");
p2.setAge(27);
p2.setSex("woman");
System.out.println("传值后.....姓名:"+p1.getName()+"性别:"+p1.getSex()+"年龄:"+p1.getAge());
}
}
打印结果:
/**
* @description :引用传递举例(数组)
* @date : 2014-4-2下午04:11:22
* @author :王宝健
*/
public class Test2 {
public static void main(String[] args) {
String[] array1=new String[]{"wangbaojian","liushaokang","lichao"};
String[] array2=null;
System.out.println("传值前遍历array1:");
for(String a: array1){
System.out.print(a+" ");
}
System.out.println();
array2=array1;
array2[1]="yanghiuhui";
System.out.println("传值后遍历array1:");
for(String a: array1){
System.out.print(a+" ");
}
}
}
打印结果: