@aloxc
2018-06-26T16:08:13.000000Z
字数 1307
阅读 475
一起学
如题,最近在总结东西,忽然看到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;}@Overridepublic 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的确是值传递,而不是引用传递。

