[关闭]
@aloxc 2018-06-26T16:08:13.000000Z 字数 1307 阅读 409

java究竟是值传递还是引用传递

一起学


如题,最近在总结东西,忽然看到csdn有人问java究竟是值传递还是引用传递,
后面跟帖的基本上都是说值传递,然后基本也都是没说出个所以然来。

今天我也来说下什么是值传递,什么是引用传递。

  • 值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
  • 引用传递是指在调用函数时候会改变此参数的值。

其实单单说理论对于刚入门的同学来说还是很拗口,直接看下面的例子吧。

  1. public class ValueDeliveryTest {
  2. public static void main(String[] args) {
  3. Person person = new Person("aloxc",20);
  4. System.out.println("未变更实例值 " + person);
  5. changeAge(person);
  6. System.out.println("变更实例中年龄的值后 " + person);
  7. changePerson(person);
  8. System.out.println("变更实例值后 " + person);
  9. }
  10. static void changePerson(Person p ){
  11. p = new Person("zhangsan",45);
  12. System.out.println("变更实例过程中的值后 " + p);
  13. }
  14. static void changeAge(Person p){
  15. p.setAge(30);
  16. }
  17. static class Person{
  18. private String name ;
  19. private int age;
  20. public Person(String name, int age) {
  21. this.name = name;
  22. this.age = age;
  23. }
  24. public String getName() {
  25. return name;
  26. }
  27. public void setName(String name) {
  28. this.name = name;
  29. }
  30. public int getAge() {
  31. return age;
  32. }
  33. public void setAge(int age) {
  34. this.age = age;
  35. }
  36. @Override
  37. public String toString() {
  38. return "Person["+hashCode()+"]{" +
  39. "name='" + name + '\'' +
  40. ", age=" + age +
  41. '}';
  42. }
  43. }
  44. }

代码执行,输出结果如下:

  1. 未变更实例值 Person[1288141870]{name='aloxc', age=20}
  2. 变更实例中年龄的值后 Person[1288141870]{name='aloxc', age=30}
  3. 变更实例过程中的值后 Person[2054881392]{name='zhangsan', age=45}
  4. 变更实例值后 Person[1288141870]{name='aloxc', age=30}

从这个结果中我们看出,调用更改示例中某字段的值后,在原来方法中只是字段的值变了,而这个对象实例的引用还没变。再次调用另外一个方法来更改示例的引用,在被调用的方法中看实例是变了,但是回到原来方法就还是原来的那个实例。

从结果中我们得出java的确是值传递,而不是引用传递。

x

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注