首先说明,肯定以及确定的说明,java只存在值传递
public class HelloWorld{
public static void main(String[] args){
Person person=new Person();
System.out.println(person);
changeValue(person);
System.out.println(person);
}
public static void changeValue(Person person) {
person=new Person();
}
}
class Person{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
查看上面代码的输出,发现调用changeValue方法后,两次输出的地址值都是一样的,这足以说明Java只有值传递了,无论是对象还是基本类型,改变形参的值不会反应到实参上面去,这也正是值传递的奥义所在。
对于基本类型来说,这一点比较明显,不过对于引用类型来讲,很多朋友认为我们在方法里改变形参对象属性的值,是会反映到实参上面去的,因此认为这就是引用传递。
首先要强调的是,我们只是改变形参对象属性的值,反映到实参上面去的,而不是真的改变了实参的值,也就是说实参引用的对象依然是原来的对象,只不过对象里的属性值改变了而已。
我们把程序稍微改动一下
public class HelloWorld{
public static void main(String[] args){
Person person=new Person();
person.setName("美女");
System.out.println(person+" name值为"+person.getName());
changeValue(person);
System.out.println(person+" name值为"+person.getName());
}
public static void changeValue(Person person) {
person.setName("帅哥");
person=new Person();
}
}
class Person{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
此时输出结果为:
可以看到,此时对象的地址值都是一样的,只是对象中属性的值改变了而已,因此说Java当中只有值传递,但是这并不影响我们在方法中改变对象参数的属性值。
结论:java中只存在值传递