Java的值传递和引用传递

在说值传递和引用传递之前,先简单说下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,这样看起来像是值传递,其实不是。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值