@aloxc
2018-06-26T16:08:13.000000Z
字数 1307
阅读 409
一起学
如题,最近在总结东西,忽然看到csdn有人问java究竟是值传递还是引用传递,
后面跟帖的基本上都是说值传递,然后基本也都是没说出个所以然来。
今天我也来说下什么是值传递,什么是引用传递。
- 值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
- 引用传递是指在调用函数时候会改变此参数的值。
其实单单说理论对于刚入门的同学来说还是很拗口,直接看下面的例子吧。
public class ValueDeliveryTest {
public static void main(String[] args) {
Person person = new Person("aloxc",20);
System.out.println("未变更实例值 " + person);
changeAge(person);
System.out.println("变更实例中年龄的值后 " + person);
changePerson(person);
System.out.println("变更实例值后 " + person);
}
static void changePerson(Person p ){
p = new Person("zhangsan",45);
System.out.println("变更实例过程中的值后 " + p);
}
static void changeAge(Person p){
p.setAge(30);
}
static class Person{
private String name ;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person["+hashCode()+"]{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
}
代码执行,输出结果如下:
未变更实例值 Person[1288141870]{name='aloxc', age=20}
变更实例中年龄的值后 Person[1288141870]{name='aloxc', age=30}
变更实例过程中的值后 Person[2054881392]{name='zhangsan', age=45}
变更实例值后 Person[1288141870]{name='aloxc', age=30}
从这个结果中我们看出,调用更改示例中某字段的值后,在原来方法中只是字段的值变了,而这个对象实例的引用还没变。再次调用另外一个方法来更改示例的引用,在被调用的方法中看实例是变了,但是回到原来方法就还是原来的那个实例。
从结果中我们得出java的确是值传递,而不是引用传递。