在说值传递和引用传递之前,先简单说下Java的内存分配。Java的数据类型分为两类。
基本数据类型:全部存放在栈中。
引用数据类型:变量的引用存放在栈中,变量数据本身存放在堆中。
1.值传递:所有的基本数据类型都是值传递的。
结果:5;
原因:Jvm在执行change(a)方法的时候,会把变量a拷贝一份,也就是说方法里面的形参a其实是实参a的拷贝(这2个a完全没有关系)。
2.引用传递:除基本数据类型以外的所有类型(String后面具体分析)。
结果: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一次都生成一个新的对象)。
结果:abc;
原因:其实不管用哪种方式,我们都会发现chang方法中的形参a和外面的实参a指向的内存地址都是不同的。所以修改方法中的形参a并不会影响实参a,这样看起来像是值传递,其实不是。