Java值传递
package com.yanshu; /** * @author :yangyuanyuan * @description:TODO * @date :2021/1/25 13:47 */ class Person { private Integer id; private String personName; public Person(String personName) { this.personName = personName; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getPersonName() { return personName; } public void setPersonName(String personName) { this.personName = personName; } } public class TransferValueDemo { public void changeValue1(int age) { age = 30; } public void changeValue2(Person person) { person.setPersonName("XXXX"); } public void changeValue3(String str) { str = "XXX"; } public static void main(String[] args) { TransferValueDemo test = new TransferValueDemo(); // 定义基本数据类型 int age = 20; test.changeValue1(age); System.out.println("age ----" + age); // 实例化person类 Person person = new Person("abc"); test.changeValue2(person); System.out.println("personName-----" + person.getPersonName()); // String String str = "abc"; test.changeValue3(str); System.out.println("string-----" + str); } }
运行结果:
栈管运行,堆管存储
CHANGEVALUE1的执行过程
八种基本数据类型,在栈里面分配内存,属于值传递
当们执行 changeValue1的时候,因为int是基本数据类型,所以传递的是int = 20这个值,相当于传递的是一个副本,main方法里面的age并没有改变,因此输出的结果 age还是20,属于值传递。
CHANGEVALUE2的执行过程
因为Person是属于对象,传递的是内存地址,当执行changeValue2的时候,会改变内存中的Person的值,属于引用传递,两个指针都是指向同一个地址
CHANGEVALUE3的执行过程
String不属于基本数据类型,但是为什么执行完成后,还是abc呢?
这是因为String的特殊性,当我们执行String str = "abc"的时候,它会把 abc 放入常量池中
当我们执行changeValue3的时候,会重新新建一个xxx,并没有销毁abc,然后指向xxx,然后最后我们输出的是main中的引用,还是指向的abc,因此最后输出结果还是abc。