Java的值传递和引用传递

在说值传递和引用传递之前,先简单说下Java的内存分配。Java的数据类型分为两类。

基本数据类型:全部存放在栈中。

引用数据类型:变量的引用存放在栈中,变量数据本身存放在堆中。

1.值传递:所有的基本数据类型都是值传递的。

Java的值传递和引用传递

结果:5;

原因:Jvm在执行change(a)方法的时候,会把变量a拷贝一份,也就是说方法里面的形参a其实是实参a的拷贝(这2个a完全没有关系)。

2.引用传递:除基本数据类型以外的所有类型(String后面具体分析)。

Java的值传递和引用传递

结果:name="张三",age=20;

原因:Jvm在执行change(people)的时候,其实是新创建了一个变量引用people2(随便命名的,便于理解),people2和mPeople都指向同一个内存地址,然后people2对内存地址存放的数据进行修改。

3.String: string的实例化有2种方式。

(1)String s ="abc";

(2)String s =new String("abc");

第一种方式:Jvm会先在string共享池里面查找,看是否存在"abc"对象,如果存在就将s指向"abc"对象,如果不存在就分配内存生成"abc"对象并放到共享池中,然后将s指向"abc"对象。

第二种方式:直接分配内存,新生成"abc"对象(每new一次都生成一个新的对象)。

Java的值传递和引用传递

结果:abc;

原因:其实不管用哪种方式,我们都会发现chang方法中的形参a和外面的实参a指向的内存地址都是不同的。所以修改方法中的形参a并不会影响实参a,这样看起来像是值传递,其实不是。